jQuery promise执行顺序与javascript promise不同

Ben*_*inH 2 javascript jquery promise

以下Promise行为符合预期,Promisereturn语句中得到满足,then之后在最后一次调用之前执行:

(new Promise(resolve => resolve(true)))
.then(function(){
    console.log(0);
    return new Promise(resolve => setTimeout(resolve, 1000))
    .then(function() {
        console.log(1);
    });
}).then(function() {
    console.log(2);
});
Run Code Online (Sandbox Code Playgroud)

结果是

0
1
2

但是当第一个Promise是jQuery时,Promise就像在下面的例子中一样

$.post("index.php")
.then(function() {
    console.log(0);
    return new Promise(resolve => setTimeout(resolve, 1000))
    .then(function() {
        console.log(1);
    });
}).then(function() {
    console.log(2);
});
Run Code Online (Sandbox Code Playgroud)

结果是

0 2 1

这表明第二个Promise没有像标准的JavaScript承诺那样传递.
有没有办法强制标准行为?

我正在使用jQuery 2.0.0.

Ber*_*rgi 5

jQuery 2不支持Promises/A +,也不能同化来自其他实现(" thenables ")的promises.从回调中返回并解析外部承诺的本机承诺不会被等待,而是用作立即履行值.您可以通过检查传递给最终回调的参数来看到这一点.

有没有办法强制标准行为?

请参阅如何在链接两个异步jQuery函数时完全避开jQuery promises? 基本上只是包装$.post("index.php")开始你的链,Promise.resolve以获得一个本地的承诺与其所有的荣耀(和预期的行为).

反过来(在jQuery承诺中包装来自超时的本机承诺)我真的不推荐,但它基本上归结为

return $.Deferred(def => promise.then(def.resolve, def.reject)).promise()
Run Code Online (Sandbox Code Playgroud)