2017-07-07 118 views
2

我正在为运行在NodeJS上的游戏制作一个bot代码,该函数应该做什么是循环遍历一组向量,然后让bot进入每个向量。通过异步数组的Javascript循环

但是,它实际上做的是告诉机器人在同一时间,因此spazzes出来,然后运行到所有向量运行到数组中最后一个向量:

function digSchedule() { 
    var arrayLength = blocksToMine.length; 
    for (var i = 0; i < blocksToMine.length; i++) { 
     console.log(i); 
     scaffoldTo(blocksToMine[i]); 
    } 
    ... 
} 

功能scaffoldTo()需求然后等待机器人执行所述函数,然后为数组中的下一个元素运行它,但我无法弄清楚如何执行此操作。

+0

嗨D,欢迎来到SO!很好格式化的问题与示例代码 - 爱它:) – Ben

+1

阅读异步承诺 –

+0

**忘了提及我在nodeJS上运行这**它不会让我编辑OP idk –

回答

0

有几种方法可以实现这一点。第一种可能是用“下一个要调用的函数”传递回调(可能是scaffoldTo())。您可以使用.bind()创建迭代器索引i的引用。

或者,您可以设置一个循环Promise s,根据定义,它有一个.then()方法,该方法在解决承诺后执行。

最后,async/await模式类似于Promises,但有些发现它更清晰,它似乎赢得Hype Wars:https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9

回调(解决方案1)将在任何版本的JS中可用。承诺通常可用于图书馆,并在ES6中提供本机支持。异步/等待是ES2017中的建议(?),通常得到很好的支持。

+0

你可以编辑帖子以包含我使用的NodeJS?有了后我无法编辑它。 –

+0

已经做了,在顶部:) – Ben

0

这是ES2017的async functions的一个很好的使用案例。

请尝试以下方法:

async function digSchedule() { 
    var arrayLength = blocksToMine.length; 
    for (var i = 0; i < blocksToMine.length; i++) { 
     console.log(i); 
     await scaffoldTo(blocksToMine[i]); 
    } 
    ... 
} 

如果ES2017是出了问题,你最好的选择是做一个递归函数时从scaffoldTo承诺得到解决,只有再次调用自身。

+0

我在NodeJS上,并且出现此错误:SyntaxError:意外的标记功能 –

+4

异步功能是ES2017,而不是ES6 https://github.com/tc39/proposals/blob/master/finished-proposals.md – Delapouite

+0

您将需要节点7.6.0或更新。 – joews

0

这是另一种方式,你可以玩这个。这种方式更侧重于回调风格,虽然它不认为你可以修改scaffoldTo功能,以及为digSchedule

然后scaffoldTo里面你需要像这样

function scaffoldTo(block, callback){ 
    //do what ever you need to have the bot go to the vector 
    //after bot goes to vector call callback 
    callback(); 
} 
需要
function digSchedule(i, callback) { 
    if(!i){ 
     i = 0; 
    } 
    if(i < blocksToMine.length){ 
     scaffoldTo(blocksToMine[i], digSchedule(i++, callback)); 
    } 
    else{ 
    callback(); 
    } 
} 

参数

为了启动这一切你只需要调用digSchedule像这样的东西:

digSchedule({null or 0}, function(){ 
    console.log("finished visiting vectors"); 
}); 

这确实改变了模式f rom使用for循环像你一样,但我认为它也是一个有趣的方式来完成目标。

0

使用本的答案我能够学习如何做我想要的东西但是我也了解到,这不是什么工作;我不得不通过代码支持我想要的功能。感谢您的支持! :)