簡體   English   中英

如何在Node JS中同步'http請求'

[英]How to make 'http requests' synchronous in Node js

我正在嘗試執行3個“ 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,因此代碼將始終每秒運行一次

您可以使用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() ,您可以看到如何輕松定義此訂單的順序。

標題答案:您不能使它們同步。 但是您可以對它們進行排序。

您可能應該將setInterval替換為setTimeout ,然后在第三個請求完成后再發出另一個setTimeout 否則, setInterval將導致在第三個請求有機會完成之前重新發出第一個請求。 這可能是問題所在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM