2016-05-07 12 views
1

3つの 'http要求'を実行しようとしています。問題は、非同期モードの性質のため、順番に実行されないことです。すべてのリクエストは社内向けです。ここではサンプルコードです: - 私が達成しようとしている何ノードjsで 'http requests'を同期させる方法

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)を取得し、SMSやEメール(Third request)を送信します。非同期性のため、コードは何度も繰り返されています。 コードが常に毎秒実行されるように、setIntervalを使用しています。

+0

これら3つのリクエスト**は、順番に発生する必要があります。前のコールに応答があり、コールバックが起動したときにのみコールします。 – Quentin

+0

重複した質問を参照してください: http://stackoverflow.com/questions/6048504/synchronous-request-in-nodejs –

+0

これは私にも似ています。しかし、約束を使用して私の答えを参照してください。 –

答えて

1

Answer title:あなたはそれらを同期させることはできません。しかし、それらを順序付けることができます。

setIntervalsetTimeoutに置き換え、3番目の要求が完了した後に別のsetTimeoutを発行する必要があります。そうでなければ、setIntervalは、3番目の要求が完了する前に最初の要求が再発行されるようにします。これはおそらく問題です。

+0

私は毎秒全プロセスを実行したいと思います。 –

+0

@sandeshpsもう一度最初のリクエストを発行する前に、3つのリクエストをすべて完了させたい場合もあります。 –

5

あなたは簡単にシーケンスだから基本的にはちょうどリターンfulfillまたはreject経由準備ができたデータに、return new Promiseであなたの非同期機能をラップ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); 
     } 
    }); 
    }); 
} 

を使用して要求することができます。 function main()では、この注文の順序がどのように簡単に定義されているかを確認することができます。

+0

3番目のリクエストが完了する前に最初のリクエストが繰り返し発生する原因となる問題がsetIntervalの場合、問題は解決しません。 –

+0

しかし、最初に 'setInterval'が使われているのはなぜですか?正当な理解の欠如のせいで私が考えたのはなぜですか。 –

+0

@love 1秒ごとにプロセス全体を実行したい –

関連する問題