Я пытаюсь пройти через 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).
Процесс асинхронного преобразования в синхронизацию в 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);
}