Javascript - 继续 foreach
Javascript - continue foreach
我有一段代码:
var a = false;
function wait(milliseconds, async) {
if(!async) {
setTimeout(function() {
console.log('Sync timer done.');
a = true;
return true;
}, milliseconds*1000);
}
(...)
f_recipe.forEach(function(item, index) {
if (obj['actual_step'] != 0 && obj['actual_step'] != index ) {
e = "Desync";
throw e;
};
console.log("Step: " + obj.actual_step);
if(item.substr(item.length - 6) != "false)"){
if (eval(item)) {
obj['actual_step']++;
}
} else {
eval(item);
var ival = setInterval(function(){
if(a) {
console.log('do the next thing');
clearInterval(ival);
}
}, 1000);
}
});
但是当我到达 'do the next thing'(间隔完成)时,forEach 循环不会继续到数组的下一个元素。 'a' 在超时后设置为 true(JS 中的一种同步等待)。 f_recipes 是一个带有函数调用的字符串数组(例如 'wait(20, false)')。
如何让它工作?
您尝试做的事情似乎是一个非常糟糕的主意,但 promises 可以帮助解决这个问题(这里使用 Bluebird,因为它提供 Promise.delay
和 Promise.each
):
function wait(seconds, dontActuallyWait) {
return dontActuallyWait ? null : Promise.delay(seconds * 1000);
}
function runSequence(things) {
return Promise.each(things, function(thing) {
return eval(thing);
});
}
runSequence([
'console.log("hello")',
'wait(2, false)',
'console.log("hello again")',
'wait(5, false)',
'console.log("goodbye")'
]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.5.1/bluebird.min.js"></script>
我有一段代码:
var a = false;
function wait(milliseconds, async) {
if(!async) {
setTimeout(function() {
console.log('Sync timer done.');
a = true;
return true;
}, milliseconds*1000);
}
(...)
f_recipe.forEach(function(item, index) {
if (obj['actual_step'] != 0 && obj['actual_step'] != index ) {
e = "Desync";
throw e;
};
console.log("Step: " + obj.actual_step);
if(item.substr(item.length - 6) != "false)"){
if (eval(item)) {
obj['actual_step']++;
}
} else {
eval(item);
var ival = setInterval(function(){
if(a) {
console.log('do the next thing');
clearInterval(ival);
}
}, 1000);
}
});
但是当我到达 'do the next thing'(间隔完成)时,forEach 循环不会继续到数组的下一个元素。 'a' 在超时后设置为 true(JS 中的一种同步等待)。 f_recipes 是一个带有函数调用的字符串数组(例如 'wait(20, false)')。
如何让它工作?
您尝试做的事情似乎是一个非常糟糕的主意,但 promises 可以帮助解决这个问题(这里使用 Bluebird,因为它提供 Promise.delay
和 Promise.each
):
function wait(seconds, dontActuallyWait) {
return dontActuallyWait ? null : Promise.delay(seconds * 1000);
}
function runSequence(things) {
return Promise.each(things, function(thing) {
return eval(thing);
});
}
runSequence([
'console.log("hello")',
'wait(2, false)',
'console.log("hello again")',
'wait(5, false)',
'console.log("goodbye")'
]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.5.1/bluebird.min.js"></script>