node js对来自另一个函数的请求使用promises

时间:2017-09-25 01:36:36

标签: javascript node.js

我的节点服务器需要与其他服务器连接才能获取一些信息并将其发送给用户。由于在这种情况下请求是异步的,我通常使用附加库,例如request-promise。但是在这里我从多个点接到多个电话,所以我创建了一个处理它们的功能,这个解决方案不起作用。

apiCall1: function(req,res){
  var info = fetchFromOtherServer();
  console.log(info); // undefined
  res.send(info)
}
apiCall2: function(req,res){
  var info = fetchFromOtherServer();
  console.log(info); // undefined
  res.send(info)
}

function fetchFromOtherServer(){
  var options = {"method":"POST", "headers":{...},"uri":"{...}"}
  request(options, function(err,response,body){
   if(!err && response.statusCode == 200){
      console.log(body) // here is a body from other server
      return body;
    }
  }
}

首先我得到api调用函数apiCall(),调用fetchFromOtherServer函数。但在请求完成之前,节点将信息变量标记为未定义并将其发送给用户。如何更改代码以告知节点等待我从其他服务器获得响应?

2 个答案:

答案 0 :(得分:0)

您需要自己的承诺,并且您希望在您的承诺上使用当时的处理程序。 看看promise documention 和他们的例子。

apiCall1:

function(req,res){  var info_promise = fetchFromOtherServer();
  info_promise.then(function(info) {
    console.log(info); // undefined
    res.send(info)
  });
  # Also look into catch on promises for error
}

function fetchFromOtherServer(){
  return new promise(function(resolve, fail){
    var options = {"method":"POST", "headers":{...},"uri":"{...}"}
    request(options, function(err,response,body){
      if(!err && response.statusCode == 200){
        console.log(body) // here is a body from other server
        resolve( body);
      }
    }
  });
}

答案 1 :(得分:0)

如果您使用的是ES6,请使用async await。它会大大简化您的代码。

apiCall1: function(req,res){
  let response = await fetchFromOtherServer();
  // do something with response
}
apiCall2: function(req,res){
  let response = await fetchFromOtherServer();
  // do something with response
}

async function fetchFromOtherServer(){
  let options = {"method":"POST", "headers":{...},"uri":"{...}"}
  let response = await request(options);
  return response;
}