我对此失去了理智。
我想做的就是链接一组函数(同步和异步),并在完成所有操作后进行回调。
像这样的简单链接函数
function promise_chain(fns, start) {
return fns.reduce(function(previous, next) {
return previous.then(next);
}, start);
}
确实能够对事物进行排序,但我无法在我的生活中得到一个回调来触发 end 。它返回promises链中的最后一个,它应该像其他任何一个一样进行then
回调。但是这样的回调会在链中的第一个项目之后被触发。
这是小提琴。
它还包含该链接函数的变体,它确认该链确实有一个结束回调:
// This version prints the "resolved" message at the end as expected, but
// the message sequence is otherwise the same.
function wtf_promise_chain(fns, start) {
var _chain = $.Deferred();
$.when(fns.reduce(function(previous, next) {
return previous.then(next);
}, start).
then(function() {
message("chain resolved");
_chain.resolve();
}));
return _chain;
}
答案 0 :(得分:3)
您错过了一个微妙的观点:当您明确地从then
回调中返回一个承诺时,它返回的承诺依次对该值进行操作。
要获得所需的行为,您需要编写
wait(2000)
.then(function() { starter.resolve(); return chain; })
.then(function() { message("end, state is: " + chain.state()); });
您当前的版本(此处为了完整性而复制)读取
wait(2000)
.then(starter.resolve)
.then(function() { message("end, state is: " + chain.state()); });
并且starter.resolve
返回starter
,显然刚刚解决,第二个.then
会立即打印最终消息。