先定义一个返回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 回答
![?](http://img1.sycdn.imooc.com/545863c10001865402200220-100-100.jpg)
富国沪深
TA贡献1790条经验 获得超9个赞
第一个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完全一致。
添加回答
举报
0/150
提交
取消