通过异步数组的Javascript循环
我正在为运行在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()
需求然后等待机器人执行所述函数,然后为数组中的下一个元素运行它,但我无法弄清楚如何执行此操作。
有几种方法可以实现这一点。第一种可能是用“下一个要调用的函数”传递回调(可能是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中的建议(?),通常得到很好的支持。
你可以编辑帖子以包含我使用的NodeJS?有了后我无法编辑它。 –
已经做了,在顶部:) – Ben
这是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
承诺得到解决,只有再次调用自身。
我在NodeJS上,并且出现此错误:SyntaxError:意外的标记功能 –
异步功能是ES2017,而不是ES6 https://github.com/tc39/proposals/blob/master/finished-proposals.md – Delapouite
您将需要节点7.6.0或更新。 – joews
这是另一种方式,你可以玩这个。这种方式更侧重于回调风格,虽然它不认为你可以修改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循环像你一样,但我认为它也是一个有趣的方式来完成目标。
使用本的答案我能够学习如何做我想要的东西但是我也了解到,这不是什么工作;我不得不通过代码支持我想要的功能。感谢您的支持! :)
嗨D,欢迎来到SO!很好格式化的问题与示例代码 - 爱它:) – Ben
阅读异步承诺 –
**忘了提及我在nodeJS上运行这**它不会让我编辑OP idk –