我正在寻找一种优雅的方式来同步以未知顺序调用的独立回调结果。
function callback1() {
var result;
};
function callback2() {
var result;
};
//When done then call
function success(res1, res2) {
// do whatever
}
我知道我可以做这样的事情:
var res = {};
var dfd = $.Deferred();
function callback1() {
var result;
res.res1 = result;
(res.res1 && res.res2) && (dfd.resolve(res));
};
function callback1() {
var result;
res.res2 = result;
(res.res1 && res.res2) && (dfd.resolve(res));
};
dfd.done(function(result){
// do whatever
});
但如果有人想出更优雅的解决方案,我将不胜感激
最佳答案
如果您返回 Promise(内置 Promise,而不是 jQuery 延迟)并且您不关心顺序,那么您可以使用 Promise.all
:
function callback1() {
return Promise.resolve(1)
}
function callback2() {
return Promise.resolve(2)
}
var ps = [callback1(), callback2()]
function add(x, y) {
return x + y
}
Promise.all(ps).then(function(result) {
return result.reduce(add)
}).then(console.log) // => 3
如果你想对它们进行排序,你可以通过这样一种方式来实现:你可以应用一个柯里化(Currying)函数,该函数需要与已解决的 promise 一样多的参数,方法是将其提升到 promise 世界。换句话说:
function apply(pa, pf) {
return pf.then(function(f) {
return pa.then(f)
})
}
function lift(f, ps) {
return ps.reduce(function(pa, pb) {
return apply(pb, pa)
}, Promise.resolve(f))
}
function add(x) {
return function(y) {
return x + y
}
}
lift(add, ps).then(console.log) //=> 3
您还可以通过首先将结果收集到数组中然后减少它来以不需要柯里化(Currying)函数的方式对它们进行排序:
function sequence(ps) {
return ps.reduceRight(function(pa, pb) {
return pa.then(function(a) {
return pb.then(function(b) {
return [b].concat(a)
})
})
}, Promise.resolve([]))
}
function add(x, y) {
return x + y
}
// This looks similar to the Promise.all approach
// but they run in order
sequence(ps).then(function(result) {
return result.reduce(add)
}).then(console.log) // => 3
关于javascript - 同步独立回调结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34687681/