节点在调用异步函数的 for 循环中使用 await
node using await in for loop which calls an async function
我在从 for 循环中调用的异步函数取回结果时遇到了一些问题,我应该取回一个字符串,但它返回的是一个承诺
我正在遵循此语法,但我无法使其正常工作,我希望能深入了解为什么会失败 https://eslint.org/docs/rules/no-await-in-loop
这是我正在尝试使用的函数,在这种情况下 decodeTheObject 是异步的,returns 是一个承诺,但是如果我使用 await decodeTheObject
eslint 会给我一个错误,说我不能使用在 for 循环中等待,不幸的是,上面的解决方法仍然导致返回承诺而不是解析值
async function decode (request, encodedObj) {
const decodedArr = [];
try{
for (const id of encodedObj) {
decodedArr.push({
data: decodeTheObject(request, id), // this is an async function
partial: true,
});
}
await Promise.all(decodedArr);
return decodedArr;
}catch (err) {
throwError(
req,
{
errorDetails: [
{
issue: 'INVALID_ENCODING',
description: 'Invalid encoded obj',
},
],
},
);
}
};
// ----- calling function -----
const decodedObj = await decode(request, encodedItem);
const payload = {
newprop: decodedObj
};
Promise.all()
必须直接处理一系列承诺。您正在向它传递一组对象,这些对象不知道如何进入对象以获得承诺,因此,它不会完成任何有用的事情。有几种方法可以解决这个问题。
这将按顺序等待每个异步调用,获取值并将值推送到数组中:
async function decode (request, encodedObj) {
const decodedArr = [];
try{
for (const id of encodedObj) {
let data = await decodeTheObject(request, id);
decodedArr.push({data, partial: true});
}
return decodedArr;
} catch(e) {
...
}
}
或者,您可以 运行 它们与 Promise.all()
并行通过创建一个承诺数组并在该数组上使用 Promise.all()
:
async function decode (request, encodedObj) {
return Promise.all(encodedObj.map(id => {
return decodeTheObject(request, id).then(data => {
return {data, partial: true};
});
})).catch(err => {
...
});
}
我在从 for 循环中调用的异步函数取回结果时遇到了一些问题,我应该取回一个字符串,但它返回的是一个承诺 我正在遵循此语法,但我无法使其正常工作,我希望能深入了解为什么会失败 https://eslint.org/docs/rules/no-await-in-loop
这是我正在尝试使用的函数,在这种情况下 decodeTheObject 是异步的,returns 是一个承诺,但是如果我使用 await decodeTheObject
eslint 会给我一个错误,说我不能使用在 for 循环中等待,不幸的是,上面的解决方法仍然导致返回承诺而不是解析值
async function decode (request, encodedObj) {
const decodedArr = [];
try{
for (const id of encodedObj) {
decodedArr.push({
data: decodeTheObject(request, id), // this is an async function
partial: true,
});
}
await Promise.all(decodedArr);
return decodedArr;
}catch (err) {
throwError(
req,
{
errorDetails: [
{
issue: 'INVALID_ENCODING',
description: 'Invalid encoded obj',
},
],
},
);
}
};
// ----- calling function -----
const decodedObj = await decode(request, encodedItem);
const payload = {
newprop: decodedObj
};
Promise.all()
必须直接处理一系列承诺。您正在向它传递一组对象,这些对象不知道如何进入对象以获得承诺,因此,它不会完成任何有用的事情。有几种方法可以解决这个问题。
这将按顺序等待每个异步调用,获取值并将值推送到数组中:
async function decode (request, encodedObj) {
const decodedArr = [];
try{
for (const id of encodedObj) {
let data = await decodeTheObject(request, id);
decodedArr.push({data, partial: true});
}
return decodedArr;
} catch(e) {
...
}
}
或者,您可以 运行 它们与 Promise.all()
并行通过创建一个承诺数组并在该数组上使用 Promise.all()
:
async function decode (request, encodedObj) {
return Promise.all(encodedObj.map(id => {
return decodeTheObject(request, id).then(data => {
return {data, partial: true};
});
})).catch(err => {
...
});
}