javascript - 如何进行连续的 HTTP 调用?

标签 javascript node.js httprequest

我需要调用几个 API 来收集和合并信息。 我进行第一个 API 调用,然后根据结果对第二个 API 进行多次调用(循环中)。 由于 http 请求是异步的,我丢失了信息。当第二步完成时,服务器(nodejs)已经将响应发送回客户端。

我已经尝试过以某种方式使用回调函数。这设法使对客户端的响应保持等待,但第二次调用的信息仍然丢失。我想不知何故变量没有同步。 我还使用away/async进行了快速测试,但我的Javascript魔力不足以使其运行没有错误。

/* pseudo code */
function getData(var1, callback){

url= "http://test.server/bla?param="+var1;

request.get(url, function (error, response, body){
var results = [];
  for(var item of JSON.parse(body).entity.resultArray) {  
     var o = {};
     o['data1'] = item.data1;
     o['data2'] = item.data2;
     o['data3'] = item.data3;

     getSecondStep(o, function(secondStepData){
       //console.log("Callback object");
       //console.log(o);
       o['secondStepData'] = secondStepData;
     });
     results.push(o);
  }
  callback(results);
});
}

function getSecondStep(object, callback){

  url = "http://othertest.server/foobar?param=" + object.data1;
  request.get(url, function (error, response, body){
    var results = [];
    if(response.statusCode == 200){
      for(var item of JSON.parse(body).object.array) {
        var o = {}
        o['data4'] = item.data4;
        o['data5'] = item.data5;
        results.push(o);
      }
      callback(results);
    }
});
}

我希望能够将所有信息收集到一个 JSON 对象中,然后将其返回给客户端。 然后,客户端将负责以良好的方式呈现它。

最佳答案

我建议将异步/等待模式与request-promise-native一起使用图书馆。

这使得 API 调用非常容易,并且使用此模式时代码更加清晰。

在下面的示例中,我只是调用 httpbin API 来生成 UUID,但该原理适用于任何 API。

const rp = require('request-promise-native');

async function callAPIs() {
    let firstAPIResponse = await rp("https://httpbin.org/uuid", { json: true });
    console.log("First API response: ", firstAPIResponse);

    // Call several times, we can switch on the first API response if we like.
    const callCount = 3;
    let promiseList = [...Array(callCount).keys()].map(() => rp("https://httpbin.org/uuid", { json: true }));
    let secondAPIResponses = await Promise.all(promiseList);

    return { firstAPIResponse: firstAPIResponse, secondAPIResponses: secondAPIResponses };
}

async function testAPIs() {
    let combinedResponse = await callAPIs();
    console.log("Combined response: " , combinedResponse);
}

testAPIs();

在这个简单的示例中,我们得到如下组合响应:

{
    { 
        firstAPIResponse: { uuid: '640858f8-2e69-4c2b-8f2e-da8c68795f21' },
        secondAPIResponses: [ 
            { uuid: '202f9618-f646-49a2-8d30-4fe153e3c78a' },
            { uuid: '381b57db-2b7f-424a-9899-7e2f543867a8' },
            { uuid: '50facc6e-1d7c-41c6-aa0e-095915ae3070' } 
        ] 
    }
}

关于javascript - 如何进行连续的 HTTP 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56493976/

相关文章:

javascript - 使用核心 JavaScript 中的名称和值属性检查单选按钮

node.js - 找不到请求的 nodejs 包

node.js - 为什么我在上网几个小时后收到 503 错误? Node/ express

javascript - 哪些场景可以关闭浏览器同源策略?

c# - 如何以编程方式重新启动 Netgear 调制解调器?

javascript - 如何在 jQuery Datepicker 上使用 BeforeShowDay 设置 2 个函数?

javascript - 捕获 401 并在同一组件上呈现消息

javascript - 将innerHTML更改回其原始值,但使用JavaScript获取 "undefined"

javascript - ejs/node.js 中的字符串连接错误

go - 为什么没有填充此 HTTP 请求的响应字段?