为了账号安全,请及时绑定邮箱和手机立即绑定

js 用promise处理并发的时候遇到一些奇怪的问题?

js 用promise处理并发的时候遇到一些奇怪的问题?

幕布斯6054654 2019-02-26 21:18:00
先定义一个返回promise函数的函数,成功时返回预定义的时间值function getTime(time) {            return new Promise(function (resolve, reject) {                setTimeout(function () {                    resolve(time)                }, time)            })        }var times = Array.apply(null, Array(100)).map(function (n, index) {//定义一个0-990间隔为10的预定义时间的数组            return index * 10;        })var RealTimes = [];//真实的返回时间var log = [];var startTime = new Date();  times.map(getTime).forEach(function (timePromise, index) {      timePromise.then(function (time) {        RealTimes.push(new Date() - startTime);         if (RealTimes.length === times.length) {              RealTimes.map(function (value, index) {                        log.push(`${times[index]}(${value})`)                    })                    console.log(log);                }            })        })下面是执行后输出的预定义的时间和真实返回的时间的对比
查看完整描述

1 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

  1. 第一个setTimeout任务是在两次遍历以后才执行的,一次times.map(getTime),一次之后的forEach,从结果看setTimeout(fn,0)是过了48ms才执行的,基本是两次遍历的耗时。之后,每一个setTimeout任务执行时都会触发promise.then再执行一段js,就是那段push数组和判断打印的逻辑,promise.then的异步优先级是要比setTimeout高的,下一个setTimeout要等上一个setTimeout的promise.then执行完才会触发执行的。从结果看,后面每个setTimeout执行的间隔都在10ms左右,基本是执行promise.then的耗时。

  2. 后面两个例子console.log(time)打印的都是传入的参数,是自己和自己比。

  3. Promise.all(times.map(getTime)).then(function(time) {console.log(time)})返回结果应该是个数组,和times完全一致。


查看完整回答
反对 回复 2019-03-07
  • 1 回答
  • 0 关注
  • 388 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信