2016-07-28 6 views
2

私は、拒否された約束をマップしてフィルターに掛けるために、Promiseというオブジェクトの配列を持っています。フィルターが拒否されました。

予想される出力:

const promises = [ 
    failedPromise, 
    successPromise, 
    successPromise, 
]; 

const resolvedPromises = promises.map(promise => ???); 

resolvedPromises変数べきコンテナ2つのsuccessPromise約束の出力。

どのようにこのようなアルゴリズムを実装しますか?

+0

故障していないから、失敗した差別化されていますか? 2つのオブジェクトはどのように見えるのですか? – jcollum

+0

見てください[ここで](http://stackoverflow.com/a/30930421/1048572)。同期の状態を同期的に決定することは不可能であることに注意してください。あなたが得られる最高のものは、fufilled約束(またはその結果)の約束です。 – Bergi

答えて

7

標準的な約束を同期的に検査することはできません。そのため、解像度ステータスで配列をフィルタリングすることはできません。しかし、Promise.allを使用して、解決された値のリストを取得することができます。ここで拒否を処理するために、どのように少しトリックがある:

const promises = [ 
 
    Promise.resolve(1), 
 
    Promise.reject(2), 
 
    Promise.resolve(3) 
 
]; 
 

 
const FAIL_TOKEN = {}; 
 

 
const resolvedPromises = Promise.all(
 
    promises.map(p => p.catch(e => FAIL_TOKEN)) 
 
).then(
 
    values => values.filter(v => v !== FAIL_TOKEN) 
 
); 
 

 
resolvedPromises.then(values => console.log(values));

+1

ES6では、 'Symbol(" failed ")'空のオブジェクトの代わりに。 – Bergi

関連する問題