我试图在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
我认为每个循环是同步的,为什么会发生这种情况?我该怎么办?
谢谢!
答案 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.forEach
和console.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