Ben*_*inH 2 javascript jquery promise
以下Promise行为符合预期,Promise在return语句中得到满足,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.
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)