2015-07-13 85 views
0

我有一些代碼使用async庫,它目前使用callback(err, result)樣式回調,但需要使用promise。我有一些數據項需要傳遞給promise返回函數。我希望數組中的任何一個對象能夠成功完成(即沒有錯誤)。與異步,我會做這樣的事情:async.detect沒有錯誤承諾?

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

如果可能的話,得到了'result'值的'datum'是成功將是很好的爲好。 –

+0

你在尋找'detect'還是'detectSeries'? – Bergi

+0

要麼是好的。 –

回答

0

沒有,目前是本地的承諾(如藍鳥全功能庫確實有輔助功能,如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"))); 
}