此代码调用一个返回promise的函数(getTable()
):
function getTables() {
while (mLobby.tblCount() < 4) {
getTable().then(function(response) {
mLobby.addTable(response);
}, function (error) {
console.error("getTable() finished with an error: " + error);
});
}
}
由于异步函数调用的冲突和while
循环的正常流程,它永远无法解析(并最终由于完全内存而崩溃)。我尝试使用递归调用将while
更改为if
,但结果相同:
function getTables() {
if (mLobby.tblCount() < 4) {
getTable().then(function(response) {
mLobby.addTable(response);
getTables();
}
});
}
答案 0 :(得分:3)
有没有特别的理由在while循环中执行此操作并在执行时将结果添加到lobby对象? 也许你只能使用一个标准的循环来调用getTable 4次:
function getTables(limit=4){
let results = [];
for(let i=0; i<limit;i++){
results.push(getTable());
}
return Promise.all(results);
}
您的方法将返回一个promise,该promise将使用给定getTable-calls的结果数组来解析
getTables().then(tables => {
tables.forEach(table => {
if(myLobby.tableCount() < 4) myLobby.addTable(table)
})
}).catch(console.warn)
答案 1 :(得分:3)
根据我的经验,在while
之类的同步操作中使用Promise将无法正常工作。
我所做的是使用async await
来完成同样的任务。有点像...
async function getTables() {
while (mLobby.tblCount() < 4) {
await getTable();
// whatever other code you need...
}
}
因此,只有在解决了每个getTable()
调用后,while循环才会继续按预期工作。显然,绝对可以测试这段代码。
这是我正在谈论的一个非常简单的工作示例:https://codepen.io/alexmacarthur/pen/RLwWNo?editors=1011