2016-04-03 2 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

Я добавил асинхронный пример –