簡體   English   中英

使用Node.JS中的迭代進行異步調用

[英]Async call with iteration in Node.JS

我正在做一個練習問題,以熟悉Node。 我設置了我的應用程序,路由,並有一個控制器。

我使用外部API並傳入不同的ID,(稍后)我想將響應與傳遞給正在編寫的api的給定值進行比較。 因此,我遍歷了一組id,並將它們傳遞給api調用(通過options中的路徑)以收集所有響應。

我一直對舊的示例和文檔感到困惑...一段時間以來,我一直試圖通過Promises來做到這一點,直到我了解異步。

 /** * Controller */ const url = 'api.outsidesite.com'; const http = require('http'); productids = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; const options = { hostname: url, path: '/v1/items/${productid}?format=json&apiKey=${apiKey}', method: 'GET', timeout: 10000 }; exports.findOne = (request, response) => { const req = http.request(options, res => { res.on('data', chunk => { response.send(chunk); }); }); req.on('error', e => { console.error(e); }); req.end(); }; 

在我的路由器中,我以這種方式調用findOne:

  app.get('api/products/findone/:value', products.findOne); 

現在,我被困在迭代並插入id上。 我一直在閱讀異步/等待並按順序進行通話。

正在考慮使用內置的請求庫,但我不知道這是否真的必要。

我試圖基於迭代promise的這個stackoverflow答案來做到這一點

  const fetchProductDetails = productids => { return productids.reduce(function(promise, product) { return promise.then(function() { return findOne.done(function(res) { console.log(res); }); }); }, Promise.resolve()); }; fetchProductDetails(productids).then(function() { console.log('all done'); }); 

但是后來我意識到答案已經有4年了,現在可能有更好的方法了。 加上對findOne的調用是未定義的,因此我對如何使用mix中的express引用export.findOne函數感到有些困惑。 關於迭代的干凈解決方案有什么想法嗎? 考慮使用異步序列或類似的東西:

 getAll = () => async.reduce( productids, 0, function(memo, item, callback) { // pointless async: process.nextTick(products.findOne()); }, function(err, result) { console.log(err); } ); 

但是我一直在執行較舊的解決方案,如果有一種簡單的方法,我也不想走錯路。 謝謝!

資源:

異步最佳做法

回調vs承諾vs asyncwait

從節點8.4開始,我強烈建議使用本機異步/等待。 不再需要任何庫,並且干凈的代碼易於調試和遵循堆棧跟蹤。 不再有藍鳥了,但是您仍然可以使用prosync作為fs和rimraf等同步功能...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM