Promise的並行和序列

2021-09-20 08:38:43 字數 3423 閱讀 1248

這個功能promise自身已經提供,不是本文的重點。主要是依賴promise.all和promise.race。

promise.all是所有的promise執行完畢後(reject|resolve)返回乙個promise物件。

promise.race是任意乙個promise物件執行完畢後返回乙個promise物件。

有人可能會說,不是promise物件reject的時候要catch麼,這個嘛,.catch只是.then的一種變體。

詳情可以參考promise.all和promise.race

這個promise物件本身沒有提供,也是本文的重點。

promise一單開始執行,執行上是不存在序列執行的,你想想,比如典型的計時的promise。

const p1 =

newpromise((resolve, reject) =>

,1000)

})const p2 =

newpromise((resolve, reject) =>

,2000)

})

像上面這種,你怎麼去序列,當然是不行的。所以,思路得改變。把上面的promise修改為如下

const p1 =

function () ,

1000)

})},

p2 =

function () ,

2000)

})},

哦,不是直接的promise物件,再利用promise.then時執行該p1(),使得promise鏈條得以繼續。

/**

* 順序執行promise,並返回結果

* @param

promises

* @param

cb * @param

args

*/function

sequence(promises, cb, ...args)

let i =

0//如果cb不是函式

if (typeof cb !==

'function')

function

callback(...params) ).then(r =>

) }

return

callback(...args)

}

先解釋一些一下引數

args 其他的傳入引數

返回來看,核心就是callback函式,他會順序執行promises的函式返回promise,然後取檢查是否執行到最後,如果還有promise等待執行,就呼叫callback,繼續執行下乙個,反之,結束。

我們來看乙個簡單的例子

const p1 =

function () ,

1000)

})},

p2 =

function () ,

2000)

})},

p3 =

function () ,

3000)})}

function

printtime()

const promises = [p1, p2, p3]

sequence(promises,

function (r, i, ...args) ,

,3).then(r =>

printtime('result:'

, r))

// 輸出結果

result:

1 index:

1 args:[object object],

3result:

2 index:

2 args:[object object],

3result:

3 index:

3 args:[object object],

32018-3-916:

43:44 result:

3

可以看到

callback 函式,拿到的引數是,上次的執行結果, 索引值,傳入的其他引數

三個返回promise的函式是依次執行的

/**

* 轉換為promise集合

* @param

promises

* @param

args

*/function

topromise(promises, ...args)

/*** 返回promise.all

* @param

promises

* @param

args

*/function

all(promises, ...args)

/*** 返回promise.race

* @param

promises

* @param

args

*/function

race(promises, ...args)

/*** 順序執行promise,並返回結果

* @param

promises

* @param

cb * @param

args

*/function

sequence(promises, cb, ...args)

let i =

0//如果cb不是函式

if (typeof cb !==

'function')

function

callback(...params) ).then(r =>

) }

return

callback(...args)

}/**

* 順序執行promise,並返回結果, 需要主動執行sequence(promises)(6)

* @param

promises

* @param

args

*/function

delaysequence(promises, cb, ...args)

}const plus =

module.exports

= plus

這裡我應用到了自己編寫的 flow的mongoactivity.js,用來順序執行mongo的操作命令.

這裡再貼乙份 30-seconds-of-code 裡面的runpromisesinseries

const runpromisesinseries = ps =>

ps.reduce((p, next) =>

p.then(next),

promise.resolve());

並行和序列

並行和序列都是通訊中資料傳輸的方式,二者有著本質的不同。1.並行通訊 同一時刻,可以傳輸多個bit位的訊號,有多少個訊號位就需要多少根訊號線。2.序列通訊 同一時刻,只能傳輸乙個bit位的訊號,只需要一根訊號線。比如,當需要傳輸1位元組資訊時,並行通訊需要8根訊號線,實現同時傳輸,假如耗時為1t,而...

序列和並行

序列傳輸 序列傳輸即序列通訊,是指使用一條資料線 將資料一位一位地依次傳輸,每乙個資料佔據乙個固定的時間長度,其只需要少數幾條線就可以在系統之間交換資訊,特別適合計算機和計算機 計算機和外設之間的遠距離通訊。並行傳輸 並行傳輸指的是資料以成組的方式,在多條並行通道上同時進行傳輸,是在傳輸中有多條資料...

Promise在並行中的使用

then的任務被放進微任務裡 settimeout的任務被放進巨集任務裡 微任務做完後再做巨集任務 const task1 newpromise resolve,reject 3000 const task2 newpromise resolve,reject 4000 const task3 ne...