在承诺链中有没有办法让其中一个成员向链中添加承诺?
这段代码更好地说明了我的意思:
$.ajax(......).then(function(r){
.....
return r;
}).then(function(r){
var d = $.Deferred();
// how to add d.promise() to this chain ?
....
return r;
}).then(function(r){
// this function should be able to receive "r"
// but should also wait for the promise above to complete :(
....
});
答案 0 :(得分:1)
我没有太多使用jQuery承诺的经验,但绝对可以与另一个承诺,就像Nicolas Bevacqua在这篇Ponyfoo文章ES6 Promises in Depth中解释它一样。
var p = Promise.resolve()
.then(data => new Promise(function (resolve, reject) {
setTimeout(Math.random() > 0.5 ? resolve : reject, 1000)
}))
p.then(data => console.log('okay!'))
p.catch(data => console.log('boo!'))
我希望你可以根据自己的需要调整它,或者使用原生承诺。
答案 1 :(得分:1)
要从r
返回.then()
,请在.resolve()
r
函数中使用$.Deferred()
参数beforeStart
,从d.promise()
返回.then()
r
的{{1}}可以在链中的下一个.then()
访问
.then(function(r) {
.....
var d = $.Deferred(function(dfd) {
// do stuff
dfd.resolve(r)
});
// how to add d.promise() to this chain ?
....
return d.promise();
})
$.when(1).then(function(r) {
return r;
}).then(function(r) {
var d = $.Deferred(function(dfd) {
// do stuff
setTimeout(function() {
dfd.resolve(r)
}, Math.random() * 2500)
});
// how to add d.promise() to this chain ?
//....
return d.promise();
})
.then(function(r) {
console.log(r)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>