如何改变一个承诺链
How to alter a promise chain?
在承诺链中,是否有任何方法可以让其中一个成员将承诺添加到链中?
下面的代码更好地说明了我的意思:
$.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 :(
....
});
我对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!'))
我希望你能适应你的需要,或者使用原生的承诺。
从.then()
返回r
,在$.Deferred()
beforeStart
函数中使用带参数r
的.resolve()
,从.then()
返回d.promise()
,使r
在链中的下一个.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>
相关文章:
- 一个承诺换多个承诺-并发问题
- WinJS,从可能是异步的函数返回一个承诺,也可能不是异步的
- 在jQuery中,.state()如何确定一个承诺是挂起的、已解决的还是被拒绝的
- 转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
- 如何通过Bluebird承诺您自己的javascript api,该api使用另一个承诺的api
- jasmine 2.0测试angularjs的工厂方法,这是一个承诺
- 做一些 ajax 并使用 getJSON 返回一个承诺
- 在 AngularJS 中声明一个承诺,并带有命名的成功/错误回调
- 链承诺.all 与从上一个承诺返回的数组.all.
- 如何更好地停止一个承诺链并开始另一个承诺链
- 同时循环承诺,直到另一个承诺结束
- 在angular.extend()中向变量返回一个承诺的值
- 茉莉花单元测试模拟一个承诺
- 我能不能早点结束一个承诺
- 我制作了一个可以改变大小的谷歌地图,但它在 Firefox 中不起作用
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- 茉莉花测试一个承诺,然后功能
- 我可以创建一个承诺来检查变量是否设置为角度吗?
- 在 then() 中断开 for 循环 在一个承诺
- 如何改变一个承诺链