Я пытаюсь пройти через 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'])
}
}
Есть ли у вас контроль над тем, как пишется myfunc
? Если вы можете записать его туда, где он возвращает обещание, а не использовать обратный вызов, вы можете просто использовать await
внутри цикла.
@Ашраф Спасибо за комментарий. попробую и обновлю
@codemonkey Я новичок в JS. Похоже, мне нужно изучить обещания и асинхронность. Спасибо за предложение.
проверьте это: stackoverflow.com/questions/11488014/…
Кстати. Если вы хотите переписать свой myfunc
для использования промисов, вот как это сделать: codeandbox.io/s/interesting-banach-egdvm?file=/test.js
Процесс асинхронного преобразования в синхронизацию в 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 callbackFunc был просто заполнителем, показывающим, как работает асинхронная функция. Вы бы поменяли его на new myFile.class(mysqlParams).myfunc
Более простое и прямолинейное решение, которое я создал для этого при использовании обещания в цикле:
(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);
}
Async/await определенно поможет вам. developer.mozilla.org/en-US/docs/Learn/JavaScript/Asyncronous/…