等待 for 循环完成,然后返回值

我正在尝试遍历 value('test') 并将其发送到类函数并将返回的值推送到 array('t') 中。如何等待 for 循环完成然后打印 array('t') ?我尝试使用 Promises 和函数包装器但没有用。这是代码片段:

t = []
test = ['1', '2']
for(var i in test) {
    console.log('inside for loop')
    new myFile.class(mysqlParams).myfunc(2, test[i], result=> {
        t.push(result)
        })
    console.log('t: ' + t)
    }

有人可以帮帮我吗?

编辑:

myfunc(num, test, callback) {
    connectToMysqlDatabase()
     connection.query(getTestcaseContentCommand, function(err, testContent)  {
      if (err) {
          console.log(err)
       }
       else {
          result(testContent[0]['testcaseContent'])
       }
 }
stack overflow Wait for the for loop to complete and then return the value
原文答案
author avatar

接受的答案

以下是如何重写您的特定代码以完成您想要完成的任务:

const callbackFunc = (param1, param2, callback) => {
    setTimeout(() => callback('Ok'), 1000)
}

let t = []
const test = ['1', '2'];
const promises = [];
for(let i in test) {

    promises.push(new Promise(resolve => {
        callbackFunc(2, test[i], result => {
            resolve(result)
        })
    }))

}

Promise.all(promises)
    .then(result => {
        t = result;
        console.log(t);
    })

请注意,在您的情况下,如果 myfunc 返回了一个承诺而不是回调,它会更简单一些,但由于情况并非如此,您需要用承诺填充一个数组,然后使用 Promise.all

我还要指出,如果您的代码本身在异步函数中,您可以像这样解析 Promise.allconst t = await Promise.all(promises)


答案:

作者头像

在 javascript 中处理将异步转换为同步我们有 3 种方式,包括:

如果您愿意,我可以帮助您如何处理您的代码,请显示更多详细信息。 Tks

作者头像

在循环中使用 Promise 时,我为此创建的一个更简单直接的解决方案是:

(async (files)=> {
  for await (const file of files) {
    await uploadSingleFile(file)
    .then((fileUrl:any)=> {
        console.log(fileUrl);
    })
    .catch((error)=> {
        console.log(error)
    });

  console.log(allFilesPath);
})

在我的代码中,根据逻辑,我使用了上面的解决方案。但另一方面,因为 await 没有用,所以我尝试使用 try,最后:

try {
  for(var index=0; index < allKeys.length; index++) {
      const key = allKeys[index], value = jsonObject[allKeys[index]];

      if(Array.isArray(value)) {
          value.forEach(val => formData.append(key, val))
      } 
      else formData.append(key, value);
  }
} 
finally {
  resolve(formData);
}