相关疑难解决方法(0)

使用async/await和forEach循环

asyncawait循环中使用是否有任何问题?我正在尝试循环遍历文件数组和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这样的高阶函数,所以我只是想问一下这是否有任何问题.

javascript node.js promise async-await ecmascript-2017

864
推荐指数
24
解决办法
38万
查看次数

Javascript可迭代的技术定义是什么?如何测试它?

我一直在实现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是我似乎无法通过该属性名称访问的内容.

javascript iterator iterable ecmascript-6

4
推荐指数
1
解决办法
282
查看次数

是否有理由在ES6中使用array.forEach()for ...两者都可以使用?

随着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)

javascript arrays foreach ecmascript-6

3
推荐指数
1
解决办法
442
查看次数

为什么forEach比常规迭代器更受青睐?

我正在阅读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 for-loop ecmascript-6

3
推荐指数
2
解决办法
1082
查看次数