在循环中使用async
/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。await``forEach``await
import fs from 'fs-promise'
async function printFiles () {
const files = await getFilePaths() // Assume this works fine
files.forEach(async (file) => {
const contents = await fs.readFile(file, 'utf8')
console.log(contents)
})
}
printFiles()
这段代码确实有效,但是这可能会出问题吗?我让某人告诉我,您不应该在这样的高阶函数中使用async
/ await
,所以我只是想问一下这是否有问题。
确保代码确实有效,但是我很确定它不会执行您期望的功能。它只会触发多个异步调用,但printFiles
此后函数会立即返回。
如果要顺序读取文件, 则不能使用forEach
。只需使用现代for … of
循环即可,该循环await
将按预期工作:
async function printFiles () {
const files = await getFilePaths();
for (const file of files) {
const contents = await fs.readFile(file, 'utf8');
console.log(contents);
}
}
如果要并行读取文件,
则不能使用forEach
。每个async
回调函数调用的确会返回一个Promise,但是您将其丢弃而不是等待它们。只需使用map
,您就可以等待将获得的诺言数组Promise.all
:
async function printFiles () {
const files = await getFilePaths();
await Promise.all(files.map(async (file) => {
const contents = await fs.readFile(file, 'utf8')
console.log(contents)
}));
}
问题内容: 我不明白…是我还是这是节点中的错误? 可以按预期进行: 这发出了警告: 我懂了 问题答案: 使用与承诺回报新希望(这就是所谓的链接)。因此,当您执行以下操作时: 您的最初承诺在哪里,您将在第1行上创建一个新的承诺(现在不再存在。我们称它为 )。因此,即使您使用with ,也不会处理上的拒绝,这解释了您在控制台上看到的消息。 为了避免出现此消息,您应该在第1行的新承诺中添加a
问题内容: 我遇到了问题,我的指令只有在我的诺言得到解决后才能呈现其内容。我以为应该这样做,但是似乎没有用。 这是我的控制器: 我的指令: 范围返回还可以,当我在开发工具中检查它时并没有定义,但是我想这是因为到我检查它时,诺言已经解决了吗? 但是,返回undefined。 问题答案: 因为您的值是异步填充的,所以您需要添加一个监视函数来更新绑定的元素。 您还可以将很多复杂性转移到指令控制器中,并使
问题内容: 我陷入了我认为应该直截了当的事情。我需要从三个不同的ajax调用中获取数据,组合并处理所有三个,并将结果数组显示给用户。 以最简单的形式,我的代码如下所示: 我知道我的变量分配给了Promise,而不是实际结果,并且http请求已传递到事件队列。如果我在这些后面加上可执行语句,则这些变量将是未定义的。我不明白如何等待这些诺言解决以继续处理它们。 我想立即添加以下代码: 问题是,我不能像
问题内容: 关于这两个重要来源:NZakas- 承诺链中的归还承诺 和MDN承诺,我想提出以下问题: 每次我们从承诺履行处理程序返回值时,该值如何传递给从同一处理程序返回的新承诺? 例如, 在这个例子中,是一个承诺。也是来自履行处理程序的承诺。但是。取而代之的是神奇地解决(如何?),然后将该值传递给的实现处理程序。即使是这里的句子也令人困惑。 您能给我解释一下这到底是怎么回事吗?我对这个概念感到困
问题内容: 如果我有两个诺言A和B,其中只有一个诺言会成功,那么我如何才能成功实现一个诺言呢?我正在寻找与相似的东西,但只会返回实现的第一个诺言。我正在使用ES6的承诺。 问题答案: 反转承诺的极性,然后可以使用,因为它在第一个被拒绝的承诺上拒绝,它在反转后对应于第一个已实现的承诺: 这将返回第一个已兑现的诺言的值,或者如果全部被拒绝,则返回一系列拒绝原因。
问题内容: for (let i = 0; i < 10; i++) { const promise = new Promise((resolve, reject) => { const timeout = Math.random() * 1000; setTimeout(() => { console.log(i); }, timeout); }); 上面将给出以下随机输出: 任务很简单:确保每