這個功能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...