NodeJS变量冲突?与请求异步/同步

时间:2017-04-17 08:46:41

标签: javascript node.js

问题:数据INFO_X有时会随机变为空。

问题,

变量是否会相互覆盖INFO_1 INFO_2 INFO_3,因为Nodejs运行得很快,而不像PHP那样,它遵循一个序列/一步一步。

我在执行请求之前检查了NULLS但是调试在执行第二个请求之前显示它是NOT NULL,随机变量在提交第二个请求时将变为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);
        });

     }
  }
});

}

1 个答案:

答案 0 :(得分:2)

是的,就是这种情况,因为请求函数是异步的。我不会称之为nodejs比PHP更“快”,它只是运行异步request方法,而PHP通常是同步的。

您可以使用承诺解决问题,例如Promise.all([])并提供一系列请求函数(请参阅此处:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all),或者在您的情况下,使用此库https://github.com/caolan/async#forEach

由于您在request函数中使用了回调,因此最好选择使用上面链接中提供的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