async在await循环中使用是否有任何问题?我正在尝试循环遍历文件数组和forEach每个文件的内容.
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()
Run Code Online (Sandbox Code Playgroud)
这段代码确实有效,但这可能会出错吗?我有人告诉我你不应该使用await这样的高阶函数,所以我只是想问一下这是否有任何问题.
我一直在实现ES6 Set对象的有用子类.对于我的许多新方法,我想接受一个可以是另一个Set或一个数组的参数,或者我可以迭代的任何东西.我一直在调用我的界面中的"可迭代"并只使用.forEach()它(它适用于Set或Array.示例代码:
// remove items in this set that are in the otherIterable
// returns a count of number of items removed
remove(otherIterable) {
let cnt = 0;
otherIterable.forEach(item => {
if (this.delete(item)) {
++cnt;
}
});
return cnt;
}
Run Code Online (Sandbox Code Playgroud)
要么
// add all items from some other iterable to this set
addTo(iterable) {
iterable.forEach(item => {
this.add(item);
});
}
Run Code Online (Sandbox Code Playgroud)
但是,我怀疑我可能并没有像ES6定义的那样支持任何迭代,所以我对Javascript可迭代的真正定义是什么感兴趣,因为ES6规范使用了这个术语?
你如何在ES6 Javascript中测试它?
你应该如何迭代一般的迭代?
我在ES6规范中找到了这样的短语:
如果存在参数iterable,则期望它是一个实现@@ iterator方法的对象,该方法返回一个迭代器对象,该对象生成一个类似于二元素的对象,其第一个元素是一个将用作WeakMap键的值,其第二个元素是与该键关联的值.
但是,这指的@@iterator method是我似乎无法通过该属性名称访问的内容.
随着ECMAScript 2015(ES6)中引入的for..of,是否有任何理由继续提倡稍微使用旧版本Array.prototype.forEach()?
今天在ES6中编写的许多代码包含如下代码:
let sum = 0;
values.forEach((value) => {
sum += value;
});
Run Code Online (Sandbox Code Playgroud)
在几乎所有这些情况下,可以使用等效的for循环:
let sum = 0;
for (let value of values) {
sum += value;
}
Run Code Online (Sandbox Code Playgroud)
两种格式的更简洁版本:
values.forEach(value => sum += value);
for (let value of values) sum += value;
Run Code Online (Sandbox Code Playgroud)
for..of格式不仅适用于Array对象,也适用于其他迭代,并且性能更高.不同于Array.prototype.map()没有返回值,.forEach()这将允许进一步链接.
可以想象它可以更具可读性,因此在调用链的末尾(下面的示例)中有用,或者如果每个项应该应用于未知的回调.抛开那些边缘情况,是否应该避免?
['1', '2', 3].map(Number)
.forEach(value => sum += value)
Run Code Online (Sandbox Code Playgroud) 我正在阅读airbnb javascript指南。有一个特别的声明,说:
不要使用迭代器。首选JavaScript的高阶函数,而不要使用for-in或for-of等循环。
他们给出上述声明的原因是:
这执行了我们不变的规则。处理返回值的纯函数比副作用更容易推论。
我无法区分给出的两种编码实践:
const numbers = [1, 2, 3, 4, 5];
// bad
let sum = 0;
for (let num of numbers) {
sum += num;
}
sum === 15;
// good
let sum = 0;
numbers.forEach((num) => {
sum += num;
});
sum === 15;
Run Code Online (Sandbox Code Playgroud)
谁能解释,为什么应该forEach优先于常规for循环?真的有什么不同?使用常规药有副作用iterators吗?
javascript ×4
ecmascript-6 ×3
arrays ×1
async-await ×1
for-loop ×1
foreach ×1
iterable ×1
iterator ×1
node.js ×1
promise ×1