Дождитесь завершения цикла for, а затем верните значение

Я пытаюсь пройти через value('test') и отправить его в функцию класса и поместить возвращаемое значение в array('t'). Как я могу дождаться завершения цикла for, а затем напечатать array('t')? Я пытался использовать Promises и функциональную оболочку, но безрезультатно. Вот фрагмент кода:

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

Кто-нибудь может мне помочь?

Редактировать:

myfunc(num, test, callback) {
    connectToMysqlDatabase()
     connection.query(getTestcaseContentCommand, function(err, testContent)  {
      if (err) {
          console.info(err)
       }
       else {
          result(testContent[0]['testcaseContent'])
       }
 }

🤔 А знаете ли вы, что...
JavaScript может выполняться как на стороне клиента (в браузере), так и на стороне сервера (с использованием Node.js).


1
10 062
3

Ответы:

Процесс асинхронного преобразования в синхронизацию в javascript у нас есть 3 способа, включая:

Если вы хотите, я могу помочь вам, как обработать ваш код, пожалуйста, покажите более подробно. спасибо


Решено

Вот как переписать ваш конкретный код, чтобы выполнить то, что вы пытаетесь выполнить:

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.info(t);
    })

Обратите внимание, что в вашем случае, если бы myfunc вернул промис вместо обратного вызова, это было бы немного проще, но поскольку это не так, вам нужно заполнить массив промисами, а затем разрешить их все, используя Promise.all

Я также хотел бы отметить, что если ваш код сам находится внутри асинхронной функции, вы можете разрешить Promise.all так: const t = await Promise.all(promises)


Более простое и прямолинейное решение, которое я создал для этого при использовании обещания в цикле:

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

В какой-то момент в моем коде, по логике, я использовал решение выше. Но в другом случае ожидание не сработало, поэтому я попытался использовать попытку, наконец:

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);
}