回复:`如何实现一个异步的 reduce?`
Jiasm opened this issue · 2 comments
Jiasm commented
看到这里时,发现了有留下一个问题,好奇的写了下。
https://github.com/ElemeFE/node-interview/blob/master/sections/zh-cn/event-async.md#阻塞异步
(async () => {
let getPromise = (key) => new Promise(resolve => {
setTimeout(() => {
console.log('reduce item:', key ** 2)
resolve(key ** 2)
}, 1000)
})
let reduceResolve =
console.log('reduce start')
console.log('reduce result:', await [1, 2, 3, 4].reduce((result, cursor) => {
return async () => {
return await result() + await getPromise(cursor)
}
}, async () => 0)())
console.log('reduce end')
})()
a573367014 commented
不知道是不是这样
Array.prototype.myReduce = function(cb){
var arr = ( arguments.length > 1 ? [arguments[1]] : [] ).concat(this);
if(arr.length == 0) throw new Error("myReduce of empty array with no initial value");
if(arr.length == 1) return Promise.resolve(arr[0]);
result = Promise.resolve([arr[0],arr[1]]);
for(let i=2, len=arr.length; i<len; i++){
result = result.then( val => {
let cbResult = cb(val[0],val[1]);
return cbResult instanceof Promise ?
cbResult.then( total=>[total,arr[i]] ) :
[cbResult, arr[i]]
})
}
return result.then( val => cb(val[0], val[1]) );
}
var a = [1,2,3,4,5];
a.myReduce(function(a,b){
console.log(a,b)
return new Promise((resolve,reject)=>{
setTimeout(_=>{
resolve(a+b);
},1000)
})
//或 return a+b;
},10).then(total => {
console.log(total);
})
Lellansin commented
这个题目的功能是博主之前碰到的一个业务。具体上是有 20 个游戏服进行合服操作。合服的时候,要处理一些原本单个服中 unique 的数据的修改以及不同服之间活动数据的合并兼修,所以只能 20 个服两两 reduce。
Feel free to reopen.