如何从NodeJS中的函数返回发布请求的响应?

时间:2020-02-13 22:02:17

标签: node.js asynchronous post

我的项目中有一个函数可以处理大多数API请求(请参见下面的简化草案)

function sendRequest(){

    var reqbody;
    var resp;

    reqbody = unimportantRandomFunction();

    request.post({
        headers: {  'content-type'  : 'application/xml',
                    'accept'        : 'application/xml'},
        url: process.env.APIURL,
        body: reqbody
    }, function(error, response, body){
        resp = convert.xml2js(body, {compact:true});
    });

    return resp;
}

我面临的问题是request.post是异步的,到我收到响应时,已经返回了未定义的值。 我尝试了对promises的实验(这是我的新手),但显然我不能将返回值放在.then块中,因为该返回值不属于sendRequest函数(如果我错了,请纠正我)。 有什么想法可以让return语句起作用,那就是等待“ resp”的值被分配吗?

1 个答案:

答案 0 :(得分:2)

此修改如何?请认为这只是几个可能的答案之一。

使用承诺sendRequest()。并在异步函数中检索响应值。在以下修改的脚本中,首先运行sample()。然后运行sendRequest(),然后从console.log(res)检索响应值。

修改后的脚本:

function sendRequest() {
  return new Promise((resolve, reject) => {
    var reqbody;
    var resp;

    reqbody = unimportantRandomFunction();

    request.post(
      {
        headers: {
          "content-type": "application/xml",
          accept: "application/xml"
        },
        url: process.env.APIURL,
        body: reqbody
      },
      function(error, response, body) {
        if (error) reject(error);
        resp = convert.xml2js(body, { compact: true });
        resolve(resp);
      }
    );
  });
}

async function sample() {
  const res = await sendRequest().catch(err => console.log(err));
  console.log(res);
}

sample();  // This function is run.

参考文献:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。