2017-07-06 3 views
1

を失敗しても、私は複数のHTTPリクエストとCUMULATEを作るしようとしている複数のHTTPリクエストの実行を続行:NodeJS非同期 - 次のコードを使用してNodeJSで結果を表示し、一部は

const async = require('async'); 
const request = require('request'); 

function httpGet(url, callback) { 
    const options = { 
    url : url, 
    json : true 
    }; 
    request(options, 
    function(err, res, body) { 
     console.log("invoked") 
     callback(err, body); 
    } 
).on('error', function(err) { 
    console.log(err) 
    }); 
} 

const urls= [ 
    "http://1.2.3.4:30500/status/health/summary", 
    "http://5.6.7.8:30505/status/health/summary" 
]; 

async.map(urls, httpGet, function (err, res){ 
    if (err) 
    console.log(err); 
    else 
    console.log(res); 
}); 

ここで問題があれば、あります最初のリクエスト(http://1.2.3.4:30500/status/health/summary)が失敗し(接続の拒否など)、2番目のリクエストは処理されません。私は愚かな間違いをしているが、それを見つけることができないことを知っている。どんな助けにも感謝!

+0

。 https://www.npmjs.com/package/request-promise – hisener

+0

なぜ 'async.series'を使ったのですか?他の人のための最初の成功。 @hisenerは正しいです。要求機能は同期です。 –

+2

'要求 'は同期していません! 'async.map() 'のセマンティクスは、エラーが発生したときに最終コールバックが直ちに呼び出されるようなものです。 – robertklep

答えて

2

のようにそれを行うことができ、(マップ機能のための)主なコールバックエラーですぐに呼び出されます(これはあなたの問題です)。最初のエラーで終了しないようにするには、httpGetでerr paramをコールバックしないでください。

それぞれ非同期で使用すると、引数と関数のリストを受け取り、各要素の関数を呼び出します。エラーが発生した場合は、エラー時にhttpGet内でエラーが発生していないことを確認してください。一部のコールにエラーがあっても続行します。これはマップでも機能しますが、マップの代わりにasync.eachが適していると思いますが、eachLimitメソッドで同時呼び出し数を制限することもできます。私はrequest`が同期しているので、 `それが起こると思います

チェックhttps://caolan.github.io/async/docs.html#each

const async = require('async'); 
const request = require('request'); 

function httpGet(url, callback) { 
    const options = { 
     url : url, 
     json : true 
    }; 
    request(options, 
     function(err, res, body) { 
      if (err){ 
       console.log(err); 
       callback(); 
       return; 
      } 
      console.log("invoked") 
      callback(null, body); 
     } 
    ).on('error', function(err) { 
     console.log(err); 
     callback(); 
    }); 
} 

const urls= [ 
    "http://1.2.3.4:30500/status/health/summary", 
    "http://5.6.7.8:30505/status/health/summary" 
]; 

async.each(urls, httpGet, function (err, res) { 
}, function (err, res) { 

}); 
0

あなたが速い失敗することはありませんasync.mapをしたい場合は通話の一つがそのコールバックにエラーを渡す場合は、async.mapでこの

const async = require('async'); 
const request = require('request'); 

function httpGet(url, callback) { 
    const options = { 
    url : url, 
    json : true 
    }; 
    request(options, 
    function alwaysReportSuccess(err, res, body) { 
     callback(null, { 
     success: !err, 
     result: err ? err : body 
     }); 
    } 
).on('error', function(err) { 
    console.log(err) 
    }); 
} 

const urls= [ 
    "http://1.2.3.4:30500/status/health/summary", 
    "http://5.6.7.8:30505/status/health/summary" 
]; 

async.map(urls, httpGet, function alwaysOk(_, res){ 
    console.log(res); // will be an array with success flags and results 
}); 
関連する問題