request-promise
モジュールを使用して複数のWebサイトをチェックしようとしています。デザインごとにPromise.all
を使用した場合、約束は最初の却下で返されます。複数の要求タスクを実行し、すべての要求が満たされても拒否されても完了するのを待つ適切な方法は何ですか?私は次の2つの機能を思いついた。約束で複数のリクエストを使用する
CheckSitesV1
は、約束を拒否したため例外を返します。しかし、CheckSitesV2
は、それらが満たされているか拒否されているかに関係なく、すべての約束が完了するのを待ちます。私が書いたコードが合理的であるかどうかをコメントすることができれば幸いです。私は
const sitesArray = ['http://www.example.com','https://doesnt-really-exist.org','http://www.httpbin.org'];
async function CheckSitesV1() {
let ps = [];
for (let i = 0; i < sitesArray.length; i++) {
let ops = {
method: 'GET',
uri:sitesArray[i],
};
const resp = await rp.get(ops);
ps.push(resp);
}
return Promise.all(ps)
}
function CheckSitesV2() {
let ps = [];
for (let i = 0; i < sitesArray.length; i++) {
let ops = {
method: 'GET',
uri:sitesArray[i],
};
ps.push(rp.get(ops));
}
return Promise.all(ps.map(p => p.catch(e => e)))
}
CheckSitesV1().then(function (result) {
console.log(result);
}).catch(function (e) {
console.log('Exception: ' + e);
});
CheckSitesV2().then(function (result) {
console.log(result);
}).catch(function (e) {
console.log('Exception: ' + e);
});
を試してみてくださいについてあなたは何をしたいのですか? 'CheckSitesV1'は、' CheckSitesV2'が並行して約束を解決しません。あなたはどのような行動をしたいですか? –
私はすべてのサイトにアクセスできるかどうかをチェックしたいと思います。 'CheckSitesV1'は要求の一つが失敗すると拒否されます。 CheckSitesV2がベストプラクティスに従っているかどうかはわかりません。私はJSで非同期を待っていませんでした – Meanteacher
しかし、リクエストを並行して実行するか、または連続して実行したいですか?これは、これらの2つのソリューションの違いは何かです。また、私は最初のものが実際にあなたが望むことをしないとは思わない。約束が拒否されるとすぐに、「CheckSitesV1」は次のようにスローします:https://jsfiddle.net/gbw0c7x1/ –