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

先定义一个返回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);

                }

            })

        })

下面是执行后输出的预定义的时间和真实返回的时间的对比

https://img1.mukewang.com/5c80d8590001e06715350285.jpg


幕布斯6054654
浏览 390回答 1
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的耗时。后面两个例子console.log(time)打印的都是传入的参数,是自己和自己比。Promise.all(times.map(getTime)).then(function(time) {console.log(time)})返回结果应该是个数组,和times完全一致。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript