美文网首页
nodejs中的promise(一)

nodejs中的promise(一)

作者: 王伯卿 | 来源:发表于2018-04-14 17:21 被阅读0次

一批8oz的红酒杯在经历了水转印后,被送上了包装流水线,包装完成后,就可以送去激光打标了。因此在包装线上我们需要做:

挑拣➟磨口➟吹气➟套PE袋➟装箱

以上每个工艺均依赖于上一工艺,因此如果上一工艺还未完成,下一工艺就无法开始。

如果我们要完成这样的工艺,我们可以这么写代码。

function pick(){
    setTimeout(()=>{
        console.log('挑拣完成',new Date());
    },500);
}
function groundMouth(){
    setTimeout(()=>{
        console.log('磨口完成',new Date());
    },400);
}
function blow(){
    setTimeout(()=>{
        console.log('吹气完成',new Date());
    },300);
}
function PEbag(){
    setTimeout(()=>{
        console.log('已套PE袋',new Date());
    },200);
}
function pack(){
    setTimeout(()=>{
        console.log('装箱结束',new Date());
    },100);
}
pick();
groundMouth();
blow();
PEbag();
pack();

结果输出如下:

装箱结束 2018-04-14T07:52:23.230Z
已套PE袋 2018-04-14T07:52:23.339Z
吹气完成 2018-04-14T07:52:23.437Z
磨口完成 2018-04-14T07:52:23.532Z
挑拣完成 2018-04-14T07:52:23.633Z

我们发现程序并没有正确的输出我们的顺序,这是由于nodejs的异步所导致的。

那如果我们要输出正确的结果,我们可以换一种写法:

function start(){
    setTimeout(()=>{
        console.log('挑拣完成',new Date());
        setTimeout(()=>{
            console.log('磨口完成',new Date());
            setTimeout(()=>{
                console.log('吹气完成',new Date());
                setTimeout(()=>{
                    console.log('已套PE袋',new Date());
                    setTimeout(()=>{
                        console.log('装箱结束',new Date());
                    },100);
                },200);
            },300);
        },400);
    },500);
}
start();

这样写之后,便输出了正确的结果。

挑拣完成 2018-04-14T08:06:54.464Z
磨口完成 2018-04-14T08:06:54.873Z
吹气完成 2018-04-14T08:06:55.174Z
已套PE袋 2018-04-14T08:06:55.376Z
装箱结束 2018-04-14T08:06:55.477Z

但是这就有一个巨大的问题。如果我想在挑拣完成后再用干布擦一擦,或者在套一个PE袋之后再套一个气泡袋,这样在原代码里再加,就显得特别复杂和难以维护。

因此我们可以选择在函数体内写回调来解决这个问题。我们可以这样写:

function pick(next){
    setTimeout(()=>{
        console.log('挑拣完成',new Date());
        next();
    },500);
}
function groundMouth(next){
    setTimeout(()=>{
        console.log('磨口完成',new Date());
        next();
    },400);
}
function blow(next){
    setTimeout(()=>{
        console.log('吹气完成',new Date());
        next();
    },300);
}
function PEbag(next){
    setTimeout(()=>{
        console.log('已套PE袋',new Date());
        next();
    },200);
}
function pack(){
    setTimeout(()=>{
        console.log('装箱结束',new Date());
    },100);
}

pick(()=>{
    groundMouth(()=>{
        blow(()=>{
            PEbag(()=>{
                pack();
            });
        });
    });
});

于是,这就出现了nodejs中的回调地狱,试想,现在只是包装工艺,如果我们要加入杯身以及外协工厂的配合,这个回调会有多么的恐怖。

接下来我们的promise就要出场了。他将提供一种更加优雅的方法,让我们写回调函数。

function pick(){
    var p=new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log('挑拣完成',new Date());
            resolve();
        },500);
    });
    return p;
}
function groundMouth(){
    var p=new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log('磨口完成',new Date());
            resolve();
        },400);
    });
    return p;
}
function blow(){
    var p=new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log('吹气完成',new Date());
            resolve();
        },300);
    });
    return p;
}
function PEbag(){
    var p=new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log('已套PE袋',new Date());
            resolve();
        },200);
    });
    return p;
}
function pack(){
    var p=new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log('装箱结束',new Date());
            resolve();
        },100);
    });
    return p;
}

pick()
.then(function(data){
    return groundMouth();
})
.then(function(data){
    return blow();
})
.then(function(data){
    return PEbag();
})
.then(function(data){
    return pack();
})

写成这样之后,就更加美观清晰和易于维护了。
下篇将对nodejs中的promise进行进一步学习。

相关文章

  • nodejs中的promise(一)

    一批8oz的红酒杯在经历了水转印后,被送上了包装流水线,包装完成后,就可以送去激光打标了。因此在包装线上我们需要做...

  • 纯手写实现自己的nodejs promise 库

    纯手写实现自己的nodejs promise 库什么是Promise?promise 链Async/Await后续...

  • nodejs + cheerio + Promise(blueb

    文章概要 使用nodejs + cheerio + Promise(bluebird库实现)的nodejs课程数据...

  • 实现一个简单的Promise/Deferred框架

    利用nodejs的event模块,可以实现一个最简单的Promise/Deferred框架: Promise De...

  • Nodejs Promise 读书笔记

    Nodejs Promise 读书笔记 前言 Promise是抽象异步处理对象以及对其进行各种操作的组件。(Pro...

  • Java CompleteFuture 书写逻辑清晰的异步任务

    Future 是异步计算的结果表示,与 NodeJS 中的 Promise 类似。下图简单的描述了它的类图,继承了...

  • promise

    1、在nodejs中读取文件 原生方法进行异步访问 (每一步都需要判断) 2、将回调的方法改成promise 3、...

  • nodejs里的promise

    在使用nodejs时处理其他回调函数,在少的情况还是不错的感觉,但当回调函数一多时,整个感觉就很糟糕的,,如下图所...

  • Nodejs http + promise

    0x0 前言 有了前面的《使用Promise解决多层异步调用的简单学习》和《如何使用Nodejs进行批量下载》两篇...

  • axios的用法与功能实现

    axios是基于promise的用于浏览器和nodejs的HTTP客户端,本身有以下特征: 从浏览器中创建XMLH...

网友评论

      本文标题:nodejs中的promise(一)

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