美文网首页
洋葱圈模型

洋葱圈模型

作者: sitorhy | 来源:发表于2018-10-14 01:09 被阅读0次

一、原型


async function fn1(next)
{
    console.log("fn1")
    await next()
    console.log('end fn1')
}

async function fn2(next)
{
    console.log("fn2")
    await delay()
    await next()
    console.log('end fn2')
}


async function fn3(next)
{
    console.log("fn3")
}


function delay()
{
    return new Promise((r)=>{
        setTimeout(()=>{
            r();
        },2000)
    })
}

function compose(middlewares=[fn1,fn2,fn3])
{
    function dispatch(i)
    {
        let fn=middlewares[i]
        if(!fn){
            return Promise.resolve()
        }
        else
        {
            return new Promise((resolve)=>{
                resolve(fn(function next () {
                    return dispatch(i + 1)
                }));
            });
        }
    }

    return dispatch(0);
}

运行:

compose();

输出:

fn1
fn2
fn3 // after 2s
end fn2
end fn1

二、转码

相当于:

function compose()
{
    return new Promise((resolve)=>{
        resolve(function(next){

            console.log("fn1")
            next().then(()=>{
                console.log('end fn1')
            });

        }(

            function(){
                return new Promise((resolve2)=>{


                    resolve2(function(next2){

                        console.log("fn2")

                        return new Promise((resolve3)=>{
                            setTimeout(()=>{
                                resolve3();
                            },2000)
                        }).then(()=>{
                            next2().then(()=>{
                                console.log('end fn2')
                            });
                        })

                    }(

                        function(){
                            console.log("fn3")
                            return Promise.resolve();  、
                        }

                    ));

                });
            }

        ));
    });
}

外层Promise.resolve接收内层返回的Promise对象,外层会等待内层对象转为resolved状态后才会执行。

var p1= new Promise(function(resolve,reject){
    setTimeout(function(){

        resolve("ok")
    },2000)
})
var p2= new Promise(function(resolve,reject){
    resolve(p1) // resolve了一个promise
})

p2.then(function(res){
    console.log(res) // “ok" after 2s
})

相关文章

网友评论

      本文标题:洋葱圈模型

      本文链接:https://www.haomeiwen.com/subject/zgeaaftx.html