Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.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 Wait放入数组映射回调中?_Javascript_Asynchronous_Async Await - Fatal编程技术网

Javascript 为什么要将async Wait放入数组映射回调中?

Javascript 为什么要将async Wait放入数组映射回调中?,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我的问题与我看到的例子有关(附在下面)。 该示例加载图像,然后在屏幕上显示它们。 据我所知,作者的目标是同时加载所有图像,但我无法理解异步等待机制如何帮助他实现这一目标? 有问题的lne是: map(异步img=>await-createImage(img)) 代码: ) 不imgArr.map(异步img=>wait-createImage(img))与以下内容完全相同: for (img of imgArr) { await createImage(img); } 此代码同步创建多

我的问题与我看到的例子有关(附在下面)。 该示例加载图像,然后在屏幕上显示它们。 据我所知,作者的目标是同时加载所有图像,但我无法理解异步等待机制如何帮助他实现这一目标? 有问题的lne是:

map(异步img=>await-createImage(img))

代码:

)

imgArr.map(异步img=>wait-createImage(img))与以下内容完全相同:

for (img of imgArr)
{
    await createImage(img);
}

此代码同步创建多个
s。在img上设置src会导致浏览器开始下载该图像,并且浏览器可以一次下载多个图像

wait
在这方面的唯一作用是我们需要知道下载何时完成。每个图像下载包在一个承诺中,然后使用
promise.all将这些承诺组合起来。通过等待组合承诺,我们可以在所有下载完成后恢复代码


如评论中所述,
.map
中的
等待
是无用的。

这里的
异步
/
等待
是毫无意义的
createImage
已经返回了一个承诺,因此可以
等待承诺数组中的承诺.all(imgArr.map(createImage))
。是的,图像将被并行请求,尽管“同时请求”有些误导,因为有些请求可能比其他请求花费更长的时间。
async
函数在这里是没有意义的。回调已经返回了一个承诺,它不需要等待就可以执行另一个步骤。如果有一系列的
async
步骤,比如
createImage
,然后
fetchSomething
,那么在
createImage
之前使用
wait
是合理的。但是如何同时下载图像呢?他展示了一个图表,这3幅图片实际上是在同一时间下载的。同时http连接的浏览器限制是一个限制因素。@Eitanos30如果你有代码
[1,2]。map(async(n)=>{await fetch(n);fetch(n*10)}
然后
fetch(1)
fetch(2)
将立即一个接一个地调用。但是
fetch(10)
仅当
fetch(1)
完成时,以及
fetch(20)
fetch(2)
完成时。换句话说,
map
为每个映射元素创建
async
回调的并发执行
let x=wait someSayncFunction()
停止主函数的执行,直到
someSayncFunction
返回。这是一个指令流,没有并发性。这就像是通过另一个同步函数调用同步函数,但您可以看到真正显示图像的行是:
imgContainer.append(img)。这也发生在承诺得到解决之前你是正确的。如果我写的话,我会把这一行从承诺中移开,在承诺解决后再做。
for (img of imgArr)
{
    await createImage(img);
}