ES7异步/等待概念问题

rol*_*lls 7 javascript node.js bluebird ecmascript-7

我正在迁移现有的程序以使用async/ await(via Babel's bluebirdCoroutines)来学习这种风格.我一直在看这个教程.

我对以下行为感到有点困扰.此代码段按预期工作:

let parts = [];
let urlsP = urls.map((url, index) => { 
    return dlPart(url, index, tempDir); 
});
for (let urlP of urlsP) { // Parallel (yay!)
    parts.push(await urlP);
}
for (let part of parts) { // Sequential
    await appendFile(leFile, part);
}
Run Code Online (Sandbox Code Playgroud)

重写如下,它仍然有效,但第一次操作不再平行(完成需要更长的时间)!

let index = 0;
let parts = [];
for (let url of urls) { // NOT Parallel any more!!!
    index++;
    parts.push(await dlPart(url, index, tempDir));
}
for (let part of parts) {
    await appendFile(leFile, part);
}
Run Code Online (Sandbox Code Playgroud)

这是执行 dlPart()

function dlPart(url, num, dir) {
    var cmd = 'wget --quiet "' + url + '" -O ' + dir + "/" + num;
    return exec(cmd).then(() => {
        return dir + '/' + num;
    });
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Dat*_*sik 2

.map函数是异步的,因此其余代码不必等待它,它会在准备就绪时完成。然后,您将其替换为for loop在完成时阻止所有内容的 。

  • 并不是 for 循环阻止了一切 - 重要的是_promise 何时被创建_ - 在地图版本中你提前创建了它们,在 for 循环版本中它是一一创建的。请记住,承诺是一个“已经开始”的操作(根据您的情况下载)。 (3认同)