Node.js forEach循环的aws方法

时间:2015-08-13 23:22:12

标签: javascript node.js amazon-web-services

我试图在forEach循环完成后执行代码,这是我的问题的简化版本:

if (RegExp.prototype.flags === undefined) {
  Object.defineProperty(RegExp.prototype, 'flags', {
    configurable: true,
    get: function() {
      return this.toString().match(/[gimuy]*$/)[0];
    }
  });
}

但结果是:

  

之后超越此。

     

Test1

     

Test1

     

Test1

     

Test1

     

测试1

我认为每个循环是同步的,为什么会发生这种情况?我该怎么办?

谢谢!

2 个答案:

答案 0 :(得分:2)

正如其他人已经提到的,button2是异步的。

您需要知道所有异步调用何时完成。为此,您可以使用Async.js之类的库。这是一个例子:

ec2.describeInstances

var async = require('async'); var arr = { values: ['1', '2', '3', '4', '5'] }; async.each(arr.values, function(element, callback) { ec2.describeInstances({ InstanceIds: ['i-51ec7d83'] }, function (err, data) { console.log(data.Reservations[0].Instances[0].Tags[0].Value); callback(); // <-- this lets it know the async operation is complete }); }, function() { console.log('Excecute this after.'); }); 方法的第3个参数是each回调,当循环中的所有异步调用都已完成时,将调用该回调。

答案 1 :(得分:1)

不幸的是,我无法发表评论,但正如Chris Muench所说describeInstances可能是异步的,因为Array.prototype.forEachconsole.log是同步的。

根据AWS Docs:

All requests made through the SDK are asynchronous and use a callback interface. Each service method that kicks off a request can accept a callback as the last parameter with the signature function(error, data) { ... }. This callback will be called when the response or error data is available.

http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-making-requests.html https://nodejs.org/api/console.html#console_console