ElemeFE/node-interview

回复:`如何实现一个异步的 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')
})()

不知道是不是作者想要的结果呢。。。

不知道是不是这样

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);

})

这个题目的功能是博主之前碰到的一个业务。具体上是有 20 个游戏服进行合服操作。合服的时候,要处理一些原本单个服中 unique 的数据的修改以及不同服之间活动数据的合并兼修,所以只能 20 个服两两 reduce。

Feel free to reopen.