wsemi
Version:
A support package for web developer.
340 lines (329 loc) • 14 kB
JavaScript
import assert from 'assert'
import pmMap from '../src/pmMap.mjs'
describe(`pmMap`, function() {
async function test1() {
return new Promise((resolve, reject) => {
let ms = []
let takeLimit = 2 //通過function調用產生promise, 可受takeLimit控管同時執行數量, takeLimit=2
pmMap([1, 2, 3, 4, 5], function (v, k) {
return new Promise(function(resolve, reject) {
let d = 400 - ((v ** 2) * 10 + 50)
//console.log('call', v)
ms.push({ call: v })
setTimeout(function() {
//console.log('resolve', v, 'd', d)
ms.push({ resolve: v, d })
resolve('#' + v)
}, d)
})
}, takeLimit)
.then(function(res) {
//console.log('then', JSON.stringify(res))
ms.push({ res })
resolve(ms)
})
.catch(function(err) {
//console.log('catch', JSON.stringify(err))
ms.push({ err })
resolve(ms)
})
})
}
//cost: (1)340, (2)310, (3)260, (4)190, (5)100
//1core: call 2(0) -> resolve 2(310) -> call 3(310) -> resolve 3(310+260=570)
//2core: call 1(0) -> resolve 1(340) -> call 4(340) -> resolve 4(340+190=530) -> call 5(530) -> resolve 5(340+190+100=630)
//console.log('test1')
// test1
// call 1
// call 2
// resolve 2 d 310
// call 3
// resolve 1 d 340
// call 4
// resolve 4 d 190
// call 5
// resolve 3 d 260
// resolve 5 d 100
// then ["#1","#2","#3","#4","#5"]
// [{"call":1},{"call":2},{"resolve":2,"d":310},{"call":3},{"resolve":1,"d":340},{"call":4},{"resolve":4,"d":190},{"call":5},{"resolve":3,"d":260},{"resolve":5,"d":100},{"res":["#1","#2","#3","#4","#5"]}]
let r1 = '[{"call":1},{"call":2},{"resolve":2,"d":310},{"call":3},{"resolve":1,"d":340},{"call":4},{"resolve":4,"d":190},{"call":5},{"resolve":3,"d":260},{"resolve":5,"d":100},{"res":["#1","#2","#3","#4","#5"]}]'
it(`should return '${r1}' when run test1'`, async function() {
let ms = await test1()
assert.strict.deepStrictEqual(JSON.stringify(ms), r1)
})
async function test2() {
return new Promise((resolve, reject) => {
let ms = []
let takeLimit = 1 //通過function調用產生promise, takeLimit=1, 等同於mapSeries
pmMap([1, 2, 3, 4, 5], function (v, k) {
return new Promise(function(resolve, reject) {
let d = 400 - ((v ** 2) * 10 + 50)
//console.log('call', v)
ms.push({ call: v })
setTimeout(function() {
//console.log('resolve', v, 'd', d)
ms.push({ resolve: v, d })
resolve('#' + v)
}, d)
})
}, takeLimit)
.then(function(res) {
//console.log('then', JSON.stringify(res))
ms.push({ res })
resolve(ms)
})
.catch(function(err) {
//console.log('catch', JSON.stringify(err))
ms.push({ err })
resolve(ms)
})
})
}
//console.log('test2')
// test2
// call 1
// resolve 1 d 340
// call 2
// resolve 2 d 310
// call 3
// resolve 3 d 260
// call 4
// resolve 4 d 190
// call 5
// resolve 5 d 100
// then ["#1","#2","#3","#4","#5"]
// [{"call":1},{"resolve":1,"d":340},{"call":2},{"resolve":2,"d":310},{"call":3},{"resolve":3,"d":260},{"call":4},{"resolve":4,"d":190},{"call":5},{"resolve":5,"d":100},{"res":["#1","#2","#3","#4","#5"]}]
let r2 = '[{"call":1},{"resolve":1,"d":340},{"call":2},{"resolve":2,"d":310},{"call":3},{"resolve":3,"d":260},{"call":4},{"resolve":4,"d":190},{"call":5},{"resolve":5,"d":100},{"res":["#1","#2","#3","#4","#5"]}]'
it(`should return '${r2}' when run test2'`, async function() {
let ms = await test2()
assert.strict.deepStrictEqual(JSON.stringify(ms), r2)
})
async function test3() {
return new Promise((resolve, reject) => {
let ms = []
let takeLimit = 0 //通過function調用產生promise, takeLimit=0, 無限制同時執行數量
pmMap([1, 2, 3, 4, 5], function (v, k) {
return new Promise(function(resolve, reject) {
let d = 400 - ((v ** 2) * 10 + 50)
//console.log('call', v)
ms.push({ call: v })
setTimeout(function() {
//console.log('resolve', v, 'd', d)
ms.push({ resolve: v, d })
resolve('#' + v)
}, d)
})
}, takeLimit)
.then(function(res) {
//console.log('then', JSON.stringify(res))
ms.push({ res })
resolve(ms)
})
.catch(function(err) {
//console.log('catch', JSON.stringify(err))
ms.push({ err })
resolve(ms)
})
})
}
//console.log('test3')
// test3
// call 1
// call 2
// call 3
// call 4
// call 5
// resolve 5 d 100
// resolve 4 d 190
// resolve 3 d 260
// resolve 2 d 310
// resolve 1 d 340
// then ["#1","#2","#3","#4","#5"]
// [{"call":1},{"call":2},{"call":3},{"call":4},{"call":5},{"resolve":5,"d":100},{"resolve":4,"d":190},{"resolve":3,"d":260},{"resolve":2,"d":310},{"resolve":1,"d":340},{"res":["#1","#2","#3","#4","#5"]}]
let r3 = '[{"call":1},{"call":2},{"call":3},{"call":4},{"call":5},{"resolve":5,"d":100},{"resolve":4,"d":190},{"resolve":3,"d":260},{"resolve":2,"d":310},{"resolve":1,"d":340},{"res":["#1","#2","#3","#4","#5"]}]'
it(`should return '${r3}' when run test3'`, async function() {
let ms = await test3()
assert.strict.deepStrictEqual(JSON.stringify(ms), r3)
})
async function test4() {
return new Promise((resolve, reject) => {
let ms = []
let takeLimit = 2 //同takeLimit=0(無限制同時執行數量), 因rs已事先初始化就執行故無法受takeLimit控管
let rs = [1, 2, 3, 4, 5].map(function (v, k) {
return new Promise(function(resolve, reject) {
let d = 400 - ((v ** 2) * 10 + 50)
//console.log('call', v)
ms.push({ call: v })
setTimeout(function() {
//console.log('resolve', v, 'd', d)
ms.push({ resolve: v, d })
resolve('#' + v)
}, d)
})
})
pmMap(rs, null, takeLimit)
.then(function(res) {
//console.log('then', JSON.stringify(res))
ms.push({ res })
resolve(ms)
})
.catch(function(err) {
//console.log('catch', JSON.stringify(err))
ms.push({ err })
resolve(ms)
})
})
}
//console.log('test4')
// test4
// call 1
// call 2
// call 3
// call 4
// call 5
// resolve 5 d 100
// resolve 4 d 190
// resolve 3 d 260
// resolve 2 d 310
// resolve 1 d 340
// then ["#1","#2","#3","#4","#5"]
// [{"call":1},{"call":2},{"call":3},{"call":4},{"call":5},{"resolve":5,"d":100},{"resolve":4,"d":190},{"resolve":3,"d":260},{"resolve":2,"d":310},{"resolve":1,"d":340},{"res":["#1","#2","#3","#4","#5"]}]
let r4 = '[{"call":1},{"call":2},{"call":3},{"call":4},{"call":5},{"resolve":5,"d":100},{"resolve":4,"d":190},{"resolve":3,"d":260},{"resolve":2,"d":310},{"resolve":1,"d":340},{"res":["#1","#2","#3","#4","#5"]}]'
it(`should return '${r4}' when run test4'`, async function() {
let ms = await test4()
assert.strict.deepStrictEqual(JSON.stringify(ms), r4)
})
async function test5() {
return new Promise((resolve, reject) => {
let ms = []
let takeLimit = 1 //takeLimit=1循序執行, 執行到3先catch而跳出pmMap, 故其他任務4與5不會執行
pmMap([1, 2, 3, 4, 5], function (v, k) {
return new Promise(function(resolve, reject) {
let d = 400 - ((v ** 2) * 10 + 50)
//console.log('call', v)
ms.push({ call: v })
setTimeout(function() {
if (v === 3) {
//console.log('reject', v, 'd', d)
ms.push({ reject: v, d })
reject('#' + v)
}
else {
//console.log('resolve', v, 'd', d)
ms.push({ resolve: v, d })
resolve('#' + v)
}
}, d)
})
}, takeLimit)
.then(function(res) {
//console.log('then', JSON.stringify(res))
ms.push({ res })
resolve(ms)
})
.catch(function(err) {
//console.log('catch', JSON.stringify(err))
ms.push({ err })
resolve(ms)
})
})
}
//console.log('test5')
// test5
// call 1
// resolve 1 d 340
// call 2
// resolve 2 d 310
// call 3
// reject 3 d 260
// catch "#3"
// [{"call":1},{"resolve":1,"d":340},{"call":2},{"resolve":2,"d":310},{"call":3},{"reject":3,"d":260},{"err":"#3"}]
let r5 = '[{"call":1},{"resolve":1,"d":340},{"call":2},{"resolve":2,"d":310},{"call":3},{"reject":3,"d":260},{"err":"#3"}]'
it(`should return '${r5}' when run test5'`, async function() {
let ms = await test5()
assert.strict.deepStrictEqual(JSON.stringify(ms), r5)
})
async function test6() {
return new Promise((resolve, reject) => {
let ms = []
let takeLimit = 0 //無限制同時執行數量, 會於3先catch而跳出pmMap, 但因順發同時執行(1~5都已call), 故3 catch(260m)之後還會有resolve 1(340)與2(310)
pmMap([1, 2, 3, 4, 5], function (v, k) {
return new Promise(function(resolve, reject) {
let d = 400 - ((v ** 2) * 10 + 50)
//console.log('call', v)
ms.push({ call: v })
setTimeout(function() {
if (v === 3) {
//console.log('reject', v, 'd', d)
ms.push({ reject: v, d })
reject('#' + v)
}
else {
//console.log('resolve', v, 'd', d)
ms.push({ resolve: v, d })
resolve('#' + v)
}
}, d)
})
}, takeLimit)
.then(function(res) {
//console.log('then', JSON.stringify(res))
ms.push({ res })
resolve(ms)
})
.catch(function(err) {
//console.log('catch', JSON.stringify(err))
ms.push({ err })
resolve(ms)
})
})
}
//console.log('test6')
// test6
// call 1
// call 2
// call 3
// call 4
// call 5
// resolve 5 d 100
// resolve 4 d 190
// reject 3 d 260
// catch "#3"
// [{"call":1},{"call":2},{"call":3},{"call":4},{"call":5},{"resolve":5,"d":100},{"resolve":4,"d":190},{"reject":3,"d":260},{"err":"#3"}]
// resolve 2 d 310
// resolve 1 d 340
let r6 = '[{"call":1},{"call":2},{"call":3},{"call":4},{"call":5},{"resolve":5,"d":100},{"resolve":4,"d":190},{"reject":3,"d":260},{"err":"#3"}]'
it(`should return '${r6}' when run test6'`, async function() {
let ms = await test6()
assert.strict.deepStrictEqual(JSON.stringify(ms), r6)
})
async function test7() {
return new Promise((resolve, reject) => {
let ms = []
pmMap({
t1: 1,
t2: 2.345,
t3: 'abc',
}, function (v, k) {
return new Promise(function(resolve, reject) {
resolve(`k=${k},v=${v}`)
})
},)
.then(function(res) {
console.log('then', JSON.stringify(res))
ms.push({ res })
resolve(ms)
})
.catch(function(err) {
console.log('catch', JSON.stringify(err))
ms.push({ err })
resolve(ms)
})
})
}
let r7 = '[{"res":["k=t1,v=1","k=t2,v=2.345","k=t3,v=abc"]}]'
it(`should return '${r7}' when run test7'`, async function() {
let ms = await test7()
assert.strict.deepStrictEqual(JSON.stringify(ms), r7)
})
})