Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在while循环中对ES6承诺进行逻辑编码_Javascript_Loops_Es6 Promise - Fatal编程技术网

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

Javascript 如何在while循环中对ES6承诺进行逻辑编码,javascript,loops,es6-promise,Javascript,Loops,Es6 Promise,此代码调用一个函数(getTable()),该函数返回一个承诺: function getTables() { while (mLobby.tblCount() < 4) { getTable().then(function(response) { mLobby.addTable(response); }, function (error) { console.error("getTable() fin

此代码调用一个函数(
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循环中执行此操作并在执行此操作时将结果添加到lobble对象是否有特定的原因? 也许您可以使用一个标准for循环来调用getTable 4次:

function getTables(limit=4){
  let results = [];
  for(let i=0; i<limit;i++){
    results.push(getTable());
  }
  return Promise.all(results);
}
函数getTables(limit=4){
让结果=[];
for(设i=0;i{
tables.forEach(table=>{
if(myLobby.tableCount()<4)myLobby.addTable(table)
})
}).catch(控制台。警告)

根据我的经验,在像
这样的同步操作中使用承诺,而
不会像你想要的那样工作

我所做的是使用
asyncwait
来完成相同的任务

 async function getTables() {
     while (mLobby.tblCount() < 4) {
         await getTable();
         // whatever other code you need...
     }
 }
异步函数getTables(){ while(mLobby.tblCount()<4){ 等待可获取(); //你需要的任何其他代码。。。 } } 因此,while循环只有在每个
getTable()
调用都得到解决后才能继续工作


这里有一个非常简单的工作示例来说明我所说的:

为什么不调用您的
addTable
函数4次?(不要误读我,在循环中)我简化了这里的问题。循环值之前不知道。你能发布错误日志和getTable实现吗?递归的第二种方法是可行的,应该可以工作,确保
mLobby.tlbCount()
返回正确的值。另外,is
mLobby.addTable()
同步操作?当递归代码示例不起作用时,这意味着函数
mLobby.addTable
本身不同步,或者它没有正确地增加
mLobby.tblCount
。我已经结束了。愚蠢的软件甚至不允许我删除这个问题。这个地方让人尽可能地困难我可以问一个问题并得到答案,当我厌倦了这一切并试图删除它以避免为任何人浪费更多的时间时,它不会让我删除它。可笑的地方。没关系,至少你的问题似乎已经解决了。(是的,限制有时很烦人)
getTables().then(tables => {
  tables.forEach(table => {
   if(myLobby.tableCount() < 4) myLobby.addTable(table)
  })
}).catch(console.warn) 
 async function getTables() {
     while (mLobby.tblCount() < 4) {
         await getTable();
         // whatever other code you need...
     }
 }