Javascript - 继续foreach

时间:2017-10-26 13:55:20

标签: javascript node.js foreach wait synchronous

我有一段代码:

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);
    }
});

但是当我接着做下一件事(#interval;(间隔完成)时,forEach循环不会继续到数组的下一个元素。 '一个'超时后设置为true(JS中的同步等待类型)。 f_recipes是一个带函数调用的字符串数组(例如' wait(20,false)')。

如何让它发挥作用?

1 个答案:

答案 0 :(得分:0)

你想要做的事情似乎是一个非常糟糕的主意,但承诺可以帮助解决这个问题(在这里使用Bluebird,因为它提供了Promise.delayPromise.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>