Дождитесь завершения цикла 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'])
       }
 }

Async/await определенно поможет вам. developer.mozilla.org/en-US/docs/Learn/JavaScript/Asyncrono‌​us/…

Ashraf 24.12.2020 05:40

Есть ли у вас контроль над тем, как пишется myfunc? Если вы можете записать его туда, где он возвращает обещание, а не использовать обратный вызов, вы можете просто использовать await внутри цикла.

codemonkey 24.12.2020 05:50

@Ашраф Спасибо за комментарий. попробую и обновлю

Karthik 24.12.2020 05:52

@codemonkey Я новичок в JS. Похоже, мне нужно изучить обещания и асинхронность. Спасибо за предложение.

Karthik 24.12.2020 05:53

проверьте это: stackoverflow.com/questions/11488014/…

sonEtLumiere 24.12.2020 06:00

Кстати. Если вы хотите переписать свой myfunc для использования промисов, вот как это сделать: codeandbox.io/s/interesting-banach-egdvm?file=/test.js

codemonkey 24.12.2020 06:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
10 062
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Большое спасибо. Я не совсем понял код. Должен ли я new myFile.class(mysqlParams) в const callbackFunc = ?

Karthik 24.12.2020 06:23

@Karthik callbackFunc был просто заполнителем, показывающим, как работает асинхронная функция. Вы бы поменяли его на new myFile.class(mysqlParams).myfunc

codemonkey 24.12.2020 06:31

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

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

Другие вопросы по теме