在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ js 用promise處理并發(fā)的時(shí)候遇到一些奇怪的問題?

js 用promise處理并發(fā)的時(shí)候遇到一些奇怪的問題?

先定義一個(gè)返回promise函數(shù)的函數(shù),成功時(shí)返回預(yù)定義的時(shí)間值

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) {//定義一個(gè)0-990間隔為10的預(yù)定義時(shí)間的數(shù)組
            return index * 10;
        })
var RealTimes = [];//真實(shí)的返回時(shí)間
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);
                }
            })
        })

下面是執(zhí)行后輸出的預(yù)定義的時(shí)間和真實(shí)返回的時(shí)間的對(duì)比

["0(48)", "10(53)", "20(60)", "30(64)", "40(81)", "50(85)", "60(93)", "70(96)", "80(101)", "90(112)", "100(115)", "110(131)", "120(137)", "130(149)", "140(154)", "150(163)", "160(174)", "170(183)", "180(193)", "190(204)", "200(213)", "210(223)", "220(234)", "230(243)", "240(254)", "250(263)", "260(273)", "270(282)", "280(293)", "290(303)", "300(312)", "310(324)", "320(334)", "330(344)", "340(354)", "350(364)", "360(374)", "370(384)", "380(394)", "390(404)", "400(414)", "410(424)", "420(434)", "430(444)", "440(455)", "450(464)", "460(474)", "470(484)", "480(493)", "490(504)", "500(514)", "510(524)", "520(534)", "530(544)", "540(554)", "550(564)", "560(574)", "570(584)", "580(594)", "590(604)", "600(614)", "610(624)", "620(634)", "630(644)", "640(654)", "650(664)", "660(674)", "670(684)", "680(694)", "690(704)", "700(714)", "710(724)", "720(734)", "730(744)", "740(754)", "750(764)", "760(774)", "770(785)", "780(794)", "790(804)", "800(815)", "810(824)", "820(834)", "830(844)", "840(854)", "850(864)", "860(874)", "870(884)", "880(893)", "890(904)", "900(914)", "910(924)", "920(934)", "930(945)", "940(955)", "950(966)", "960(975)", "970(984)", "980(994)", "990(1005)"]

這個(gè)是10條時(shí)的情況
["0(56)", "10(59)", "20(64)", "30(81)", "40(88)", "50(90)", "60(92)", "70(98)", "80(102)", "90(105)"]
使用Promise的方法卻可以基本沒有偏離

Promise.race(times.map(getTime)).then(function(time) {console.log(time)})//返回 0

Promise.all(times.map(getTime)).then(function(time) {console.log(time)})//返回 在992左右

回答
編輯回答
硬扛
  1. 第一個(gè)setTimeout任務(wù)是在兩次遍歷以后才執(zhí)行的,一次times.map(getTime),一次之后的forEach,從結(jié)果看setTimeout(fn,0)是過了48ms才執(zhí)行的,基本是兩次遍歷的耗時(shí)。之后,每一個(gè)setTimeout任務(wù)執(zhí)行時(shí)都會(huì)觸發(fā)promise.then再執(zhí)行一段js,就是那段push數(shù)組和判斷打印的邏輯,promise.then的異步優(yōu)先級(jí)是要比setTimeout高的,下一個(gè)setTimeout要等上一個(gè)setTimeout的promise.then執(zhí)行完才會(huì)觸發(fā)執(zhí)行的。從結(jié)果看,后面每個(gè)setTimeout執(zhí)行的間隔都在10ms左右,基本是執(zhí)行promise.then的耗時(shí)。
  2. 后面兩個(gè)例子console.log(time)打印的都是傳入的參數(shù),是自己和自己比。
  3. Promise.all(times.map(getTime)).then(function(time) {console.log(time)})返回結(jié)果應(yīng)該是個(gè)數(shù)組,和times完全一致。
2017年7月22日 21:26