js promise异步转串行(compose实现)

63 阅读1分钟
var A = args => new Promise(resolve => {    setTimeout(() => {      console.log('A', args) // 初始化,自定义的值      resolve(1)    }, 5000)  })    var B = args => new Promise(resolve => {    setTimeout(() => {      console.log('B', args) // 输出的是 上一个函数返回值 1      resolve(2)    }, 2000)  })    var C = args => new Promise(resolve => {    setTimeout(() => {      console.log('C', args) // 输出的是 上一个函数返回值 2      resolve(3)    }, 3000)  })function compose (queue, val) {    queue.reduce(async (a,b)=>{        // async会返回一个promise        console.log('11111',a)        console.log('222222222',b)        let res         if(typeof a === 'function'){            res = await a(val)        }else{            res = await a        }        return b(res)    })}compose([A,B,C], 100)

koa洋葱模型 reduce

var A = args => new Promise(resolve => {

setTimeout(() => {

console.log('A', args) // 初始化,自定义的值

resolve(1)

}, 5000)

})

var B = args => new Promise(resolve => {

setTimeout(() => {

console.log('B', args) // 输出的是 上一个函数返回值 1

resolve(2)

}, 2000)

})

var C = args => new Promise(resolve => {

setTimeout(() => {

console.log('C', args) // 输出的是 上一个函数返回值 2

resolve(3)

}, 3000)

})

const app = {

middlewares: []

};

// 创建 use 方法

app.use = function(fn) {

app.middlewares.push(fn);

};

app.use(async (next, arg) => {

console.log(1);

const val = await A(arg)

await next(val);

console.log(2);

});

app.use(async (next,arg) => {

console.log(3);

const val = await B(arg)

await next(val);

console.log(4);

});

app.use(async ( next,arg) => {

console.log(5);

const val = await C(arg)

await next(val);

console.log(6);

});

app.compose1 = function(arg) {

// 递归函数

function dispatch(index, arg) {

// 如果所有中间件都执行完跳出

if (index === app.middlewares.length) return;

// 取出第 index 个中间件并执行

const useFn = app.middlewares[index];

return useFn((val) => dispatch(++index,val), arg);

}

// 取出第一个中间件函数执行

return dispatch(0, arg);

}