对Promises没有错误的async.detect?

时间:2015-07-13 08:37:55

标签: javascript asynchronous browser promise

我有一些代码使用当前使用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);
};

基于浏览器的承诺是否有(好的)方法?

1 个答案:

答案 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")));
}