【问题标题】:Node - Wait request response within cycle For节点 - 在周期内等待请求响应
【发布时间】:2014-12-20 14:24:53
【问题描述】:

真的,我已经尝试了所有方法,但我找不到解决方案。

由于不会英文,而且我用的是谷歌翻译,所以我会连续解释几遍。

1º 尝试 For 循环将等到所有内容都在其中完成

2º 我试图知道该城市在外部 Web 请求上运行良好。和许多城市一​​样,一旦我检查了第一个城市,我就需要打破循环。

3º 我需要去一个 json 并在运行时执行一个动作并等待它完成跟随。然后随时退出循环。


我一直在用几个代码进行测试,但为了更好地理解,在这里展示一下。

---------------------------------------------------------------------

var city = 
[
    {'city':'madrid'},
    {'city':'barcelona'},
    {'city':'valencia'},
    {'city':'malaga'}
];

var vBreak = 0;

for (i in city){

    request('example.there-city.com/' + city[i].city ,function (error, response, read) {
        if (read == 'OK') { vBreak = 1}
    });

if (vBreak == 1){ break;}
}

var city = 
[
    {'city':'madrid'},
    {'city':'barcelona'},
    {'city':'valencia'},
    {'city':'malaga'}
];

var vBreak = 0;

for (i in city){

    (function(i) {
        request('example.there-city.com/' + city[i].ciudad ,function (error, response, read) {
            if (read == 'OK') { vBreak = 1}
        });
    })(i);

if (vBreak == 1){ break;}
}

谢谢

【问题讨论】:

  • 这正是 JavaScript 异步的原因:你不能等到一切都完成,你必须使用回调。看看循环的异步模块:github.com/caolan/async
  • 我真的建议你阅读并理解this answer。它是关于 ajax 调用的,但是异步的概念是一样的。您必须真正了解异步代码如何工作才能正确编程并获得您想要的结果。你不能把它和同步代码一样对待。
  • @jgillich JavaScript 并不是真正的异步。也许您考虑使用 Node.js,但 ECMAScript 规范并未声明“JavaScript 是异步的”

标签: javascript json node.js for-loop asynchronous


【解决方案1】:

使用 async.eachSeries(如 jgillic 所说)按如下顺序执行每个请求:

async.eachSeries(city, function (item, cb) {
  if (vbreak !== 1) {
    request('example.there-city.com/' + item.city ,function (error, response, read) {
        if (read == 'OK') { vBreak = 1}
        cb();
    });
  } else {
    cb() // Skip
  }
}, function () { // we're finished
})

您可能需要添加错误处理。

【讨论】:

    【解决方案2】:

    尝试使用递归函数。只是增加计数器,响应来后...

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      相关资源
      最近更新 更多