2016-05-07 45 views
1

我試圖執行3個'http請求'。問題在於,由於異步模式的性質,它不會按順序執行。所有請求都是內部API。這裏的示例代碼: -如何使'http請求'在節點j中同步

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,因此代碼將始終每秒運行

+0

這三個請求**應該按順序發生。當前一個人有迴應並且回叫觸發時,您只能撥打一個。 – Quentin

+0

查看重複的問題: http://stackoverflow.com/questions/6048504/synchronous-request-in-nodejs –

+0

是的,這看起來對我來說也是正確的。儘管如此,請參閱使用承諾的答案。 –

回答

1

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

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

+0

我還想每秒運行整個過程。 –

+0

@sandeshps但你也希望它在再次發出第一個請求之前完成所有三個請求 –

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); 
     } 
    }); 
    }); 
} 

所以基本上只是通過fulfillreject包住異步功能與return new Promise,以回報就緒數據容易測序的請求。在function main()中,您可以看到如何輕鬆定義此訂單的序列。

+0

如果問題是導致第三個請求在第三個請求完成之前重複發生的'setInterval',那麼這並不能解決問題。 –

+0

但爲什麼'setInterval'在第一個地方被使用?只是因爲缺乏正確的理解纔是我的想法。 –

+0

@love我想每一秒運行整個過程 –