2016-04-03 73 views
0

我正在对后端服务器进行两个API调用,并且正在使用以下方法向用户显示json中的两个响应。但是,警报2根据控制台是'未定义';警报1起作用。我究竟做错了什么?显示多个API调用的结果

app.get("/blah", function (req, res) { 

    var alert = 'api call for alert' 
    var alert2 = 'api call for alert 2' 


    request(alert, alert2, function (error, response, alert, alert2) { 

     console.log(alert); 
     console.log(alert2); 

     res.json({ 
      Alert: alert, 
      Alert2: alert2 
     }); 
    }); 
}); 

回答

1

这是因为请求不允许以这种方式从一次调用异步进行多个请求。

您可以异步实现这一点的一种方法是使用async.parallel从异步模块。

但是,为了简单起见,我只是要提供一个不需要异步模块的示例,而是将以串行方式工作。

这不是执行此操作的最有效的方式,因为在您的示例中,第二个请求不需要首先完成第一个请求。

app.get("/blah", function (req, res) { 

    var alert = 'api call for alert' 
    var alert2 = 'api call for alert 2' 

    request(alert, function (error, response, alert) { 

     console.log(alert); 

     request(alert2, function (error, response, alert2) { 
      console.log(alert2); 

      res.json({ 
       Alert: alert, 
       Alert2: alert2 
      }); 
     }); 
    }); 
}); 

异步例如(https://github.com/caolan/async):

app.get("/blah", function (req, res) { 

    var alert = 'api call for alert' 
    var alert2 = 'api call for alert 2' 

    async.parallel([ 
     function(callback) { 
      request(alert, function (error, response, alert) { 
       if(error) { 
        callback(error); 
       } else { 
        callback(null, alert); 
       } 
      }); 
     }, 

     function(callback) { 
      request(alert2, function (error, response, alert2) { 
       if(error) { 
        callback(error); 
       } else { 
        callback(null, alert2); 
       } 
      }); 
     } 
    ], function(err, results) { 
     res.json({ 
      Alert: results[0], 
      Alert2: results[1] 
     }); 
    }); 
}); 
+0

谢谢你,但我想的Node.js是异步的? –

+0

它通常是,但在本例中,由于第二个请求位于第一个请求的回调中,这意味着第一个请求必须已经完成 - 因此它被阻塞并且不是异步的。 –

+0

我已经添加了一个异步示例 –