2017-10-13 1 views
0

プロミスの使い方についてちょっと混乱します。 以下の例をご覧ください。promise.all []を使用するかチェーンコールを停止するときに例外をキャッチするにはどうすればいいですか

Q1。チェーンコールを停止するにはどうしたらいいですか?コードが示すように

const wait = (duration = 0) => { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, duration); 
 
    }); 
 
}; 
 

 
const asyncTask1 =() => { 
 
    return wait(1000).then(() => { 
 
    console.log('task1 takes 1s.'); 
 
    }); 
 
}; 
 

 
const asyncTask2 =() => { 
 
    return wait(3000).then(() => { 
 
    console.log('task2 takes 3s.'); 
 
    }); 
 
}; 
 

 
Promise.resolve() 
 
    .then(() => { 
 
    asyncTask1(); 
 
    }) 
 
    .then(() => { 
 
    asyncTask2(); 
 
    }) 
 
    .catch(() => { 
 
    console.log('fail.'); 
 
    });

asyncTask1が完了するまで、asyncTask2は実行されません。しかし、問題は、asyncTask1が失敗した場合に、チェーンコールを停止する方法です。つまり、asyncTask1が失敗するためが実行されません。 です。 注:asyncTask1でエラーまたは例外が生成されていないため、asyncTask1の結果を決定するためにステータス(成功または失敗)を使用します。

Q2。 Promise.all()を使用すると、どのタスクが例外を生成するかをどのように知ることができますか?

const wait = (duration=0) => { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, duration); 
 
    }); 
 
}; 
 

 
const asyncTask1 =() => { 
 
    return wait(1000).then(() => { 
 
    console.log('task1 takes 1s.'); 
 
    }); 
 
}; 
 

 
const asyncTask2 =() => { 
 
    return wait(3000).then(() => { 
 
    console.log('task2 takes 3s.'); 
 
    }); 
 
}; 
 

 
Promise 
 
    .all([asyncTask2(), asyncTask1()]) 
 
    .then(() => { 
 
    console.log('all done.'); 
 
    }) 
 
    .catch((e) => { 
 
    console.log('error'); 
 
    });

上記のコードは正常に実行できますが、asyncTask1またはasyncTask2が失敗した場合、それはキャッチ機能になります。したがって、例外はasyncTask1asyncTask2かどうかをどのように知ることができますか?

+0

.map()コールバック内で発生する要素のthrowindexちょうどごとに固有のエラーをスローして、あなた、配列で設定した機能を呼び出すためにArray.prototype.map()を使用することができますそれがどのエラーであるかを調べるためにエラーを検査することができる。それ以外の場合は、 'Promise.all()'をいつ使用するかを知る方法がありません。それは、最初の拒絶を、それがどれであるかの報告なしで報告するだけである。 – jfriend00

+0

'新しいプロミスの実行者関数が** 2つの引数をとっていることを知っておきたいと思うかもしれません...' '新しいプロミス((解決する、拒絶)=>拒否( 'しばらく))')は、/fulfill it –

+0

"*コードが示すように、asyncTask1が完了するまで、asyncTask2は実行されません。そのためには、 'then'コールバックから' return'edというタスクを約束する必要があります。それ以外の場合は、チェーンで待たされることはありません。 – Bergi

答えて

0

あなたはエラーが.catch()

const wait = (duration=0) => { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, duration); 
 
    }); 
 
}; 
 

 
const asyncTask1 =() => { 
 
    return wait(1000).then(() => { 
 
    console.log('task1 takes 1s.'); 
 
    }); 
 
}; 
 

 
const asyncTask2 =() => { 
 
    return wait(3000).then(() => { 
 
    throw new Error() 
 
    console.log('task2 takes 3s.'); 
 
    }); 
 
}; 
 

 
let arr = [asyncTask2, asyncTask1]; 
 

 
Promise 
 
    .all(arr.map((p, index) => 
 
    p().catch(err => {throw new Error(err + " at index " + index)}))) 
 
    .then(() => { 
 
    console.log('all done.'); 
 
    }) 
 
    .catch((e) => { 
 
    console.log('error', e); 
 
    });

関連する問題