【问题标题】:How to wait for multiple API calls to reutrn?如何等待多个 API 调用返回?
【发布时间】:2022-01-09 11:44:43
【问题描述】:

我有一组要查询的 API。例如var urls = ['example.org?x=1', 'example.org?x=2,3']如何让 ReactJS 在响应客户端之前等待所有响应(即 JSON)返回?

我已经尝试从Promises with http.get node.js 修改@Shanoor 的答案,但客户端的结果是空的 ("")。

var http = require('http');
var urls = ['example.org', 'example2.org', '...'];

var done = 0;
var result = [];

function callback(index, data) {
  result[index] = data;
  done++;
  if (done == urls.length) {
    result.forEach(console.log);
    //I tried using the resp object here to return result[] but the data seemed corrupt 
  }
}

function processUrl(url, index) {
  var finalData = '';
  http.get(url, function(response) {
    response.setEncoding('utf8');
    response.on('data', function(data) {
      finalData += data;
    });
    response.on('error', console.error);
    response.on('end', function() {
      callback(index, finalData);
    })
  });
}

app.get("/api/blah", (resp) => {
  urls.forEach(processUrl);
  //resp(result); this would result in an empty response
}

【问题讨论】:

    标签: javascript node.js json express asynchronous


    【解决方案1】:

    你可以使用 Promise 来做到这一点,应该是这样的

    function processUrl(url, index) {
      var finalData = '';
    
      return new Promise((resolve, reject) => {
        http.get(url, function(response) {
          response.setEncoding('utf8');
          response.on('data', function(data) {
            finalData += data;
          });
          response.on('error', reject);
          response.on('end', function() {
            resolve(finalData);
          })
        });
      })
    }
    
    app.get("/api/blah", (resp) => {
      Promise.all(urls.map(processUrl)).then(function(results) {
        console.log(results);
      });
    }
    

    请注意,我没有检查代码是否正常工作,因此请阅读有关PromisesPromise.all() 方法的更多信息

    【讨论】:

    • 这是因为第一个参数是一个索引。再次查看代码,我将其编辑为仅解析 finalData 参数,不需要索引
    猜你喜欢
    • 2016-09-03
    • 2011-11-15
    • 2021-01-13
    • 1970-01-01
    • 2017-12-15
    • 2012-05-04
    相关资源
    最近更新 更多