我有一些代码使用当前使用callback(err, result)
样式回调的async库,但需要使用promises。我有一个数组项需要传递给promise-returns函数。我希望数组中的任何一个对象的promise成功完成(即没有错误)。使用异步,我会做类似的事情:
var foo = function(dataIn, callback) {
async.detect(dataIn, function(datum, cb) {
bar(datum, function(err, result) {
if(err) cb(false);
else cb(true);
});
}, callback);
};
基于浏览器的承诺是否有(好的)方法?
答案 0 :(得分:0)
不,目前没有本地承诺的功能(像Bluebird这样的功能齐全的库有Promise.any
等辅助功能),所以你必须自己实现它:
function firstFulfilled(promises) {
return new Promise(function(resolve, reject) {
for (var i=0; i<promises.length; i++)
Promise.resolve(promises[i]).then(resolve, function() {
if (--i == 0)
reject(new Error("no promise was fulfilled"));
});
if (i==0)
reject(new Error("no promises given"));
});
}
var foo = function(dataIn, callback) {
firstFulfilled(dataIn.map(bar)).catch(function(err) {
return undefined; // not sure whether you want this, but async.detect does it
}).then(callback);
};
或者,如果要按顺序执行异步函数,那么它可能会更简单一些:
function firstFulfilled(data, callback) {
return data.reduce(function(acc, datum) {
return acc.catch(function() {
return callback(datum);
});
}, Promise.reject(new Error("no promises given")));
}