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