CNode

在 for 循环中使用 await 是好的实践么?为什么 eslint 会提示不要这样使用?

问答
Mmeiwhu发布于8 年前最后回复8 年前15 回复14818 浏览0 收藏

在 for 循环中使用 await 是好的实践么?为什么 eslint 会提示不要这样使用?

查看回复

回复 (15)

A
atian25#1·8 年前

贴代码看看,应该是因为你写的代码并不是你预期的样子。

for await of 还没出来

M
meiwhu#2·8 年前
引用 atian25贴代码看看,应该是因为你写的代码并不是你预期的样子。 for await of 还没出来

@atian25 这是eslint的提示信息:Unexpected await inside a loop. (no-await-in-loop);我用的是airbnb的配置。

for (let i = 0; i < 10; i += 1) {
	await xxx;
}
D
dislido#5·8 年前

如果你确定是要按顺序执行就放心用,eslint提示是防止你本来想promise.all它

Z
zhhb#6·8 年前

for ... of 就不要搞复杂逻辑了,你可以试下 forEach + async/await

C
CodeofGame#7·8 年前

又get到一个技能啊

不好的写法
async function foo(things) {
  const results = [];
  for (const thing of things) {
    results.push(await bar(thing));
  }
  return baz(results);
}
好的写法
async function foo(things) {
  const results = [];
  for (const thing of things) {
    results.push(bar(thing));
  }
  return baz(await Promise.all(results));
}
A
atian25#8·8 年前
H
heguangda#9·8 年前
引用 CodeofGame又get到一个技能啊 不好的写法 好的写法

@CodeofGame 这两种写法没有哪个好哪个不好吧,只有适合哪种业务

来自酷炫的 CNodeMD

M
meiwhu#10·8 年前
引用 dislido如果你确定是要按顺序执行就放心用,eslint提示是防止你本来想promise.all它

@dislido 嗯,eslint文档也说了,确定要顺序执行就disable这条规则就行了。

K
k-dylan#11·8 年前

@heguangda 这两种写法是不一样的 第一种是顺序执行 第二种是并行执行

D
dudueasy#12·8 年前
引用 CodeofGame又get到一个技能啊 不好的写法 好的写法

@CodeofGame 方法1 在push 前都需要等待 promise resolve, 会比较花时间吧.

T
tong3jie#13·8 年前

for await of NODE已经支持,但eslint还没有识别。

L
libook#14·8 年前

并不是会触发ESLint规则警告的就是不好的用法,正像3楼所说,ESLint官方提供了文档,解释了因为什么原因设计了这一项规则,其中也给出了什么时候使用这个规则、什么时候不适合使用这个规则的建议。

怎么写看你的具体需求。for中的代码需要控制执行顺序的话用await;不需要的话就可以不加await,把promise抛给下游去await,这样下游如果是异步执行的话效率高。 还有一种是async generator function,感兴趣可以了解一下。

H
heguangda#15·8 年前
引用 k-dylan@heguangda 这两种写法是不一样的 第一种是顺序执行 第二种是并行执行

@k-dylan 额.我知道呀,我说的是没有哪个好哪个不好,只有适合不适合业务需求

参与回复
登录后即可参与回复。登录