2016-12-21 10 views
1

私は約束を返すasyncを実行しているループ内のリストを処理しています。例外で処理を終了したくないので、それらを集約してfinally finallyブロックのresolveコールバックに渡します。 これがアンチパターンであるかどうかを知りたいのですが、もしそうなら、正しく行う方法についての指針を提供してください。おかげさまで それは世界的に合法的に見えるようエラーを集約し、解決策を約束するためのアンチパターン?

例は

async doSomething(list) { 
let errorCount = 0 
let errors = [] 
return new Promise(async (resolve, reject) => { 
    try { 
    list.forEach(async (item) => { 
     try { 
     actionThatThrows(item) 
     } catch (e) { 
     errorCount++ 
     errors[errorCount] = e 
     } 
    }) 
    } catch (e) { 
    errorCount++ 
    errors[errorCount] = e 
    } finally { 
    if (errorCount > 0) { 
     resolve(errors) 
    } else { 
     resolve() 
    } 
    } 
}) 

}

+0

これは「外側」はfinallyブロックです特に何、100%明確ではありません。あなたはあなたの質問に例を挙げてください。 –

+0

明確ではありません。明確に説明する。いくつかのサンプルコードを提供してください –

+0

@DenysSéguret、Guarav、質問を更新して例を含めて – Krazibit312

答えて

8

はい、このコードは、いくつかのアンチパターンを採用しています

私は、例外の処理を終了するが、それらは

あなたはそのためのWait until all ES6 promises complete, even rejected promisesを見てすることができます集約する必要はありません。

しかし、あなたは、順次反復したいと仮定すると、同様にそれらなしでそれを行うことができます:doSomethingの非同期

async function doSomething(list) { 
    const errors = []; 
    for (let item of list) { 
     try { 
      await actionThatThrows(item); 
     } catch (e) { 
      errors.push(e); 
     } 
    } 
    if (errors.length) 
     return errors; 
    else 
     return …; 
} 
+0

/私swoons^__ ^ – naomik

2

エラーがあなたの非同期計算の結果です。

actionThatThrowsが(それはあなたの質問やコードに不明だ)約束を返し、それは次のように書くことができますように、それが見えると仮定すると:

function doSomething(list) { 
    let errors = [] 
    return Promise.all(list.map(
     item => actionThatThrows(item).catch(e => { 
      errors.push(e); 
     }) 
    )).then(()=>{ 
     return errors.length ? errors : undefined; 
    }); 
} 
0

1))のawaitを呼び出すので、非同期 2を削除していないlist.forEachにおける非同期ではありません待機を呼び出すので、非同期を取り除く 3)最初のキャッチはすべてをキャッチします。第二にキャッチがヒットすることはありませんので、コードを簡略化することができ

二キャッチを削除し、最終的に

doSomething(list) { 
    let errorCount = 0, 
     errors = []; 
    for (let item of list) { 
     try { 
      actionThatThrows(item); //I suppose this is not returning a promise 
     } catch (e) { 
      errorCount += 1; 
      errors[errorCount] = e; 
     } 
    } 
    if (errorCount > 0) { 
     return errors; //return Promise.reject(errors); 
    } else { 
     //return Promise.resolve(); 
    } 
} 
関連する問題