2017-04-17 62 views
1

問題:數據INFO_X有時隨機成爲空。NodeJS變量碰撞?與請求異步/同步

問題,

是否可變覆蓋彼此INFO_1 INFO_2 INFO_3因爲運行的NodeJS快速不像PHP它遵循一個序列/步步。

我在執行請求之前檢查了NULLS,但在執行第二個請求之前調試顯示它不是NULL,隨機,隨機變量在提交第二個請求時將變爲空。

我也檢查了我的源碼絕對不是返回null。

在發送第二個請求之前變量被覆蓋或者是什麼?請指教。

var request = require('request'); 

var urls = [ 'URL', 
      'URL', 
      'URL']; 

urls.forEach(processUrl); 

function processUrl(url) { 

    request(url, function (error, response, body) { 
    if (!error) { 
    var obj = JSON.parse(body); 
    for (var i = 0, len = obj['products'].length; i < len; ++i) { 
     var data = obj['products'][i]; 
     var INFO_1 = data.INFO_1 
     var INFO_2 = data.INFO_2 
     var INFO_3 = data.INFO_3 

     request("URL/POSTINFO?INFO_1="+INFO_1+"&INFO_2="+INFO_2+"&INFO_3="+INFO_3+"&seller_id=", function(error, response, body) { 
      console.log(body); 
     }); 

    } 
    } 
}); 

} 

回答

2

是的,就是這樣,因爲請求函數是異步的。我不會調用nodejs比PHP更快,它只是運行異步request方法,而PHP通常是同步的。

您可以通過承諾解決問題,例如, Promise.all([])並提供請求功能的陣列(在這裏看到:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all),或在你的情況,因爲你是在request功能使用回調使用這個庫https://github.com/caolan/async#forEach

,你最好的選擇是使用async在所提供的上面的鏈接。下面是一個例子代碼:

function request(url, cb) { 
     setTimeout(() => { 
     cb(url + ' accessed at ' + new Date()); 
     }, 2000); 

    } 

    var urls = ['URL1', 'URL2', 'URL3']; 

    async.each(urls, (item) => { 
     console.log(item); 
     request(item, (value) => { 
     request(value, (newValue)=>{ 
      console.log(newValue); 
     }); 
     }); 
    }, (err) => { 
     console.log(err); 
    }); 

這裏有一個工作示例:https://plnkr.co/edit/Q5RAvKdaLxV9cUT4GP4w?p=preview

+0

請求功能是異步,的NodeJS心不是異步,因此我需要使用承諾運行要求這是一個異步功能時,使我的NodeJS代碼異步?我說得對嗎? – CodeGuru

+0

就是這樣的。 '.forEach'基本上是調用異步函數,我會提供一個簡單的例子,我會在幾分鐘內更新我的答案。 – uglycode

+0

好的,我提供了一個基本的簡單例子。請讓我知道這對你有沒有用。 – uglycode