Javascript 为什么在映射函数中使用async await仍然返回承诺而不是解析的值?
我有一个对链接数组的API调用,我想使用一个映射函数来保存所有响应Javascript 为什么在映射函数中使用async await仍然返回承诺而不是解析的值?,javascript,asynchronous,promise,async-await,array-map,Javascript,Asynchronous,Promise,Async Await,Array Map,我有一个对链接数组的API调用,我想使用一个映射函数来保存所有响应 const allImages = list.map(async (imageLink) => { const image = await axios.get(imageLink); return image.data.primaryImage; }); 为什么allImages仍然是承诺数组而不是响应数组?因为array.map方法本身不是async方法。事实上,我必须记住JavaScript是一种单线程语言。
const allImages = list.map(async (imageLink) => {
const image = await axios.get(imageLink);
return image.data.primaryImage;
});
为什么
allImages
仍然是承诺数组而不是响应数组?因为array.map
方法本身不是async
方法。事实上,我必须记住JavaScript是一种单线程语言。唯一真正可以同时发生的操作是由平台处理的I/O操作
话虽如此,在您的例子中,Array.map
将在整个数组中循环,并将返回一个新数组,其中包含从回调中为每个原始项返回的值
始终立即隐式返回一个承诺,然后该承诺将解析为函数的显式返回值
这就是为什么你会得到一系列的承诺
如果你想使用这些回答,你可以这样做:
const allImages=list.map(异步(imageLink)=>{
const image=wait axios.get(imageLink);
返回image.data.primaryImage;
});
承诺。所有(所有图像)。然后((响应)=>{
console.log(responses);//这是您要查找的响应。
});
如果您有任何其他疑问,请告诉我
回复评论:
JS代码的执行永远不能暂停,它会冻结引擎并破坏JS异步实现的全部目的
当您在异步函数中发现一个await
语句时,代码执行“跳转”到async
作用域“承诺”之外,在与await
语句相关的承诺履行后立即恢复到原来的位置
JS async/await只是处理承诺的语法糖。承诺只是处理回拨的语法糖
请使用您的代码查看以下示例:
let count = 0;
const allImages = list.map(async (imageLink) => {
const image = await axios.get(imageLink);
// CODE EXECUTION 'STOPS' HERE, BUT CONTINUES OUTSIDE OF THE ASYNC SCOPE. Array.map PASSES TO NEXT ITEM.
count++;
console.log('A' + count);
return image.data.primaryImage; // THIS RESOLVES THE PROMISE.
});
// CODE EXECUTION CONTINUES
console.log('B');
Promise.all(allImages).then(() => {
// ALL PROMISES HAVE BEEN FULFILLED.
console.log('C');
});
/*
EXPECTED OUTPUT ORDER:
B
A1, A2, A3... (depending on http responses arrival order)
C
*/
希望能有一个更直观的例子,如您所料:
(async () => {
for (let i = 0; i < list.length; i++) {
const imageLink = list[i];
const image = await axios.get(imageLink);
// CODE EXECUTION 'STOPS' HERE.
list[i] image.data.primaryImage;
}
console.log(list); // AN ARRAY OF RESPONSES.
})();
// HOWEVER, CODE EXECUTION NEVER REALLY STOPS AND CONTINUES HERE. OUTSIDE OF THE async SCOPE.
(异步()=>{
for(设i=0;i
每个异步函数都返回一个承诺。结果是一个承诺列表,因为异步函数就是这么做的。Thanx,我已经这样做了,但我不清楚的是,为什么在异步函数中,执行没有暂停以等待响应异步函数总是立即显式返回承诺。
如果我在数组.map之外使用异步函数,行为会有所不同。@ilyo请查看我的更新答案。谢谢,如果我理解正确,异步函数实际上是在map函数已经完成运行之后解析的?@ilyo实际上是的。这是一个更技术性的解释。