此代码调用一个函数(getTable()),该函数返回一个promise:
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();
}
});
}发布于 2017-09-12 21:57:22
根据我的经验,在像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
发布于 2017-09-12 21:50:09
在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调用的结果数组一起解析
getTables().then(tables => {
tables.forEach(table => {
if(myLobby.tableCount() < 4) myLobby.addTable(table)
})
}).catch(console.warn) https://stackoverflow.com/questions/46177780
复制相似问题