NodeJSvariables冲突? 与请求asynchronous/同步

问题:数据INFO_X有时随机成为空值。

题 ,

这个variables是否相互覆盖INFO_1 INFO_2 INFO_3,因为Nodejs运行速度与PHP不同,它遵循一个序列/一步一步地进行。

在执行请求之前,我检查了NULLS,但在执行第二个请求之前,debugging显示它不是NULL,随机,随机variables在提交第二个请求时将变为空。

我也检查我的源是绝对不返回任何空。

在发送第二个请求之前variables是被覆盖的还是什么? 请指教。

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

是的,情况就是如此,因为请求function是asynchronous的。 我不会比PHP更快地调用nodejs,它只是运行asynchronousrequest方法,而PHP通常是同步的。

你可以用promise来解决这个问题,例如Promise.all([])并提供一个请求函数的数组(参见https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise /所有 ),或在你的情况下,使用这个库https://github.com/caolan/async#forEach

由于您在request函数中使用callback函数,所以最好的select是使用上面链接中提供的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