噩梦在循环内迭代

Nightmare iterating inside loop

我有以下代码:

for(var i = 0; i < 10; i ++){
    DoIt();
    console.log(i);
}

function DoIt(){
    var nightmare = Nightmare({
        electronPath: require('./node_modules/electron'),
        openDevTools:{
            mode: 'detach'
        },
        show: true
    });
    nightmare
        .goto('http://google.com')
        .end(()=>{
            return true;
        })
}

我在 electron 应用程序中安装了这个。然而,这会执行异步,我会立即在控制台中输出(0、1、2、3、4、5、6、7、8、9),而噩梦同时打开所有 10 windows!

如何同步执行以下代码? 我想得到以下结果:

在计数器 < 值(例如 10)时执行

1) 计数器 = 0

2) 噩梦般的工作

3) 噩梦结束,反击++


1) 计数器 = 1

2) 噩梦般的工作

3) 噩梦结束,反击++

e.t.c.

我认为你可以做类似这样的事情或 for-loop:

(function iteration(i) {
  if (i < 10) {
    DoIt(i).then(() => iteration(i + 1))
  }
})(0)

为此请确保 DoIt returns 承诺:

function DoIt(index) {
  var nightmare = Nightmare({
    electronPath: require('./node_modules/electron'),
    openDevTools: {
      mode: 'detach'
    },
    show: true
  });

  return nightmare
    .goto('http://google.com')
    .end(() => {
      return true;
    })
}

ES2017:你可以将异步代码包装在一个函数中,返回一个 promise(Nightmare returns promise)。

然后在 for 循环中调用函数,但使用神奇的 Await 关键字。 :)

function DoIt(i) {
  const Nightmare = require("nightmare");
  var nightmare = Nightmare({
    openDevTools: {
      mode: "detach"
    },
    show: true
  });

  return nightmare.goto("http://google.com").end(() => {
    return true;
  });
}

(async () => {
  for (let i = 1; i <= 10; i++) {
    await DoIt(i);
  }
})();