Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在映射函数中使用async await仍然返回承诺而不是解析的值?_Javascript_Asynchronous_Promise_Async Await_Array Map - Fatal编程技术网

Javascript 为什么在映射函数中使用async await仍然返回承诺而不是解析的值?

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是一种单线程语言。

我有一个对链接数组的API调用,我想使用一个映射函数来保存所有响应

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实际上是的。这是一个更技术性的解释。