nodejs promise mysql_nodejs中的promise(一)

一批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进行进一步学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值