2017-05-31 2 views
0

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); 
}); 
+0

を試してみてくださいについてあなたは何をしたいのですか? 'CheckSitesV1'は、' CheckSitesV2'が並行して約束を解決しません。あなたはどのような行動をしたいですか? –

+0

私はすべてのサイトにアクセスできるかどうかをチェックしたいと思います。 'CheckSitesV1'は要求の一つが失敗すると拒否されます。 CheckSitesV2がベストプラクティスに従っているかどうかはわかりません。私はJSで非同期を待っていませんでした – Meanteacher

+0

しかし、リクエストを並行して実行するか、または連続して実行したいですか?これは、これらの2つのソリューションの違いは何かです。また、私は最初のものが実際にあなたが望むことをしないとは思わない。約束が拒否されるとすぐに、「CheckSitesV1」は次のようにスローします:https://jsfiddle.net/gbw0c7x1/ –

答えて

1

あなた

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))) 
} 

は完全に罰金ですNodeJSのv7.9.0を使用しています。私は読みやすさのためにビットをリファクタリング提案することができます:

function CheckSitesV2() { 
 
    let ps = sitesArray 
 
    .map(site => rp.get({method: 'GET', uri: site}).catch(e => e)); 
 

 
    return Promise.all(ps); 
 
}

非同期が "正しい" 方法が正確にない方法でこの

async function CheckSitesV1() { 
 
    let results = []; 
 
    for (let i = 0; i < sitesArray.length; i++) { 
 
     let opts = { 
 
      method: "GET", 
 
      uri: sitesArray[i] 
 
     }; 
 
     const resp = await rp.get(opts).catch(e => e); 
 
     results.push(resp); 
 
    } 
 
    return results; 
 
} 
 

 
CheckSitesV1().then(console.log)

+0

'async' /' await'ではほとんどの人が 'try'-' catch 'を使うでしょう。それが異常で肥大しているときでも、 '.catch()'よりも:-) – Bergi

+0

@Bergi 'catch(e => e)'の目的は、エラーを抑制し、次の成功した 'then'に渡すことです。定期的な結果。 –

+0

もちろんですが、あなたは 'try {results.push(await rp.get(opts));を実行することもできます。 }キャッチ(e){結果。プッシュ(e); } '(私はそれが好きではないとしても、もっと慣用的だろうと思う) – Bergi

関連する問題