javascript – 为什么最后两个函数有效,但不是第一个?

我有三个不同的函数应该做同样的事情 – 使用已解析的Promises填充数组,但它不适用于第一个示例.

这是我的代码:

(async() => {
  const items = [];
  const someFn = async() => {
    const v = await Promise.resolve(10);
    items.push(Math.random());
    return Promise.resolve(v * 10);
  }
  const arr = [];
  for (let i = 0; i < 10; i++) {
    arr.push(someFn);
  }
  await Promise.all(arr);
  console.log("item 1",items);
})();

(async() => {
  const items = [];
  const someFn = async() => {
    const v = await Promise.resolve(10);
    items.push(Math.random());
    return Promise.resolve(v * 10);
  }
  const arr = [...Array(10).keys()].map(someFn)
  await Promise.all(arr);
  console.log("items 2",items);
})();

(async() => {
  const items = [];
  const someFn = async() => {
    const v = await Promise.resolve(10);
    items.push(Math.random());
    return Promise.resolve(v * 10);
  }
  for (let i = 0; i < 10; i++) {
    await someFn();
  }
  console.log("items 3",items);
})()

这是输出:

item 1 []

items 2 [ 0.7450904427103939,0.37106667256699555,0.12035280341441346,0.265221052932904,0.7775494303685422,0.4872532010723445,0.6497680191919464,0.2570485072009576,0.5613137531648884,0.95109416178435 ]

items 3 [ 0.25328649499657585,0.5452758396760038,0.7274346878509064,0.9306670111476503,0.22942578229725785,0.32547900377461625,0.9722902638678983,0.9964743517593542,0.2828162584401659,0.7672256760378469 ]

注意第1项是一个空数组.

解决方法

那是因为在第一个例子中,someFn永远不会被执行:

for (let i = 0; i < 10; i++) {
    arr.push(someFn);
}
await Promise.all(arr);

这部分只是将函数推送到arr变量,它不会运行它们,因此不会创建Promises并且永远不会填充items数组.

另一方面,其他示例运行someFn函数:

const arr = [...Array(10).keys()].map(someFn)

这将使用10个执行someFn填充arr数组(map使用当前值(0-9),索引(也是0-9)和数组本身执行它们).

for (let i = 0; i < 10; i++) {
    await someFn();
}

这显然在一个循环中运行someFn.

要使第一个示例工作,请将函数的结果推送到数组中:

(async () => {
    const items = [];
    const someFn = async () => {
        const v = await Promise.resolve(10);
        items.push(Math.random());
        return Promise.resolve(v * 10);
    }
    const arr = [];
    for (let i = 0; i < 10; i++) {
        arr.push(someFn()); // <-- () added
    }
    await Promise.all(arr);
    console.log("item 1",items);
})();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)