如何制作' http请求'在节点js中同步

时间:2016-05-07 06:57:11

标签: javascript node.js asynchronous synchronous

我试图执行3&#http; http请求'。问题是,由于异步模式的性质,它不会按顺序执行。所有请求都是内部api。以下是示例代码: -

setInterval(function () {
  // First request
  request({}, function (error, response, body) {
   // Second request
   request({}, function (error, response, body) {
    // Third request
    request({}, function (error, response, body) {
    })
   })
  })
},1000);

我想要实现的是根据一个条件(First request)获取数据,更新数据(Second request)并发送短信和电子邮件(Third request)。由于异步性质,代码重复多次。 我使用setInterval,因此代码将始终每秒运行

2 个答案:

答案 0 :(得分:5)

您可以使用Promises

轻松排序请求
// Load Dependencies: 
var Promise = require('promise');
var request = require('request');

// Begin Execution:
main();

function main() {
  getData()                //Executes 1st
   .then(updateData)       //Whatever is 'fulfilled' in the previous method, gets passed to this function updateData
   .then(sendNotification) //Whatever is fulfilled in the previoud method, gets passed to this function sendNotification.
   .catch(function(err) {
     console.log('If reject is called, this will catch it - ' +err);
   });
}

// Request #1:
function getData() {
  return new Promise(function(fulfill, reject) {
    request({}, function(err, res, body) {
      if (err) {
        reject('Error making request - ' +err);
      } else if (res.statusCode !== 200) {
        reject('Invalid API response - ' +body);
      } else {
        fulfill(body);
      }
    });
  });
}

// Request #2:
function updateData(data) {
  return new Promise(function(fulfill, reject) {
    request({}, function(err, res, body) {
      if (err) {
        reject('Error making request - ' +err);
      } else if (res.statusCode !== 200) {
        reject('Invalid API response - ' +body);
      } else {
        fulfill(body);
      }
    });
  });
}


// Request #3
function sendNotification(phoneNumber, email) {
  return new Promise(function(fulfill, reject) {
    request({}, function(err, res, body) {
      if (err) {
        reject('Error making request - ' +err);
      } else if (res.statusCode !== 200) {
        reject('Invalid API response - ' +body);
      } else {
        fulfill(body);
      }
    });
  });
}

所以基本上只需用return new Promise封装异步函数,通过fulfillreject 返回就绪数据。在function main()中,您可以看到如何轻松定义此订单的顺序。

答案 1 :(得分:1)

对标题的回答:你不能让它们同步。但你可以对它们进行排序。

您可能应该使用setInterval替换setTimeout,然后在第三个请求完成后再发出另一个setTimeout。否则,setInterval将导致在第三个请求有机会完成之前重新发出第一个请求。这可能是个问题。