如何在while循环中对ES6承诺进行逻辑编码

时间:2017-09-12 13:29:55

标签: javascript loops es6-promise

此代码调用一个返回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();
        }
    });
}

2 个答案:

答案 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