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
    评论
Node.js是一个基于Chrome V8 JavaScript引擎的JavaScript运行环境,可以在服务器端运行JavaScript。Sequelize是一个流行的ORM框架,它提供了对多种数据库的支持,包括MySQL。MySQL是一种流行的关系型数据库管理系统。使用Sequelize和MySQL可以轻松地在Node.js处理数据库操作。 具体来说,Sequelize是一个使用Promise实现的Node.js ORM,支持多种数据库,包括MySQL、PostgreSQL、SQLite和Microsoft SQL Server等。通过Sequelize,我们可以轻松地定义模型、查询数据和执行事务等操作。 在使用Sequelize时,需要先安装sequelize和mysql2这两个npm包。接下来,我们需要定义一个sequelize实例,并指定数据库连接信息,如下所示: ``` const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql' }); ``` 其,`database`、`username`和`password`分别是数据库的名称、用户名和密码,`localhost`是数据库所在的主机地址,`mysql`表示使用MySQL数据库。 接下来,我们可以定义一个模型,如下所示: ``` const User = sequelize.define('user', { firstName: { type: Sequelize.STRING, allowNull: false }, lastName: { type: Sequelize.STRING } }); ``` 这个模型表示一个名为User的表,包含两个字段:firstName和lastName。其,firstName是必填字段,而lastName是可选字段。 定义完模型后,我们就可以使用它来查询数据了。例如,查询所有用户的firstName和lastName字段,可以使用如下代码: ``` User.findAll({ attributes: ['firstName', 'lastName'] }).then(users => { console.log(users); }); ``` 这个代码会查询所有用户的firstName和lastName字段,并将结果输出到控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值