问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

nodejs中promise怎么用

发布网友 发布时间:2022-05-02 03:20

我来回答

2个回答

懂视网 时间:2022-05-02 07:41

最近在学习Node.js,虽然早就听说了回调地狱结果过了一周就遇到了。所以花时间学习了了一下Promise。虽然还有Async/await、co、生成器等选择,但是因为本人基础较差,以及时间问题所以决定先用好Promise。

 

你可以选择用原生的,当然最好还是用BlueBird,听说性能比官方的好很多,而且有额外的特性:promisifyAll、Promisify

官方案例:

var fs = Promise.promisifyAll(require("fs"));

fs.readFileAsync("myfile.js", "utf8").then(function(contents) {
 console.log(contents);
}).catch(function(e) {
 console.error(e.stack);
});

  

 

首先如果要使用.then语句只能在Promise对象后面使用,于是乎你必须修改原始的连接代码,让他返回一个Promise对象。当然

 

使用的原始Mysql连接代码:

var mysql=require("mysql")
var settings=require(‘../settings‘);
var pool = mysql.createPool({
 host: settings.host,
 user: settings.user,
 password: settings.password,
 database: settings.db,
 port:settings.port
});

module.exports=function(sql,callback){
 pool.getConnection(function(err,conn){
 if(err){
  callback(err,null,null);
 }else{
  conn.query(sql,function(err,rows,fields){
  //释放连接
  conn.release();
  //事件驱动回调
  callback(err,rows,fields);
  });
 }
 });
};

  将下面这段代码改成:

module.exports=function (sql) {
 return new Promise(function (resolve, reject) {
 pool.getConnection(function(err,conn){
  if(err){
  reject(err);
  }else{
  conn.query(sql,function(err,rows,fields){
   //释放连接
   conn.release();
   //传递Promise回调对象
   resolve({"err":err,
    "rows":rows,
    "fields":fields});
  });
  }
 });
 });
};

  这里解释一下一下reject与resolve这2个关键字:

reject:抛出一个异常,在最近的.catch()中接收并且处理他。

resolve:传递数据至下一个.then语句中。

这里我用resolve({"err":err,"rows":rows,"fields":fields}); 因为resolve不能传递多个对象,所以可以考虑数组或者组合成一个对象的。

 

使用案例:

var express = require(‘express‘);
var query=require(‘../module/mysql‘);
var JSON=require(‘JSON‘);
var router = express.Router();


router.post(‘/uploads/uploadFactoryInfo‘,function (req, res, next) {
 var factoryName=req.body.factoryName;
 var factoryAdress=req.body.factoryAdress;
 var contactInfo=req.body.contactInfo;
 var remark=req.body.remark;
 var updateDate=req.body.updateDate;
 var handleUserName=req.session.loginUser;
 //判断厂家名是否重复,如果重复则返回错误信息
 query("select * from managersystem.factoryinfo where factoryName=‘" +factoryName +"‘;").
 then(function (data) {
 if(data.rows[0]!=undefined)
 {
  res.json({message:‘该厂家信息已经录入!‘});
  return;
 }
 }).then(function () {
 query("INSERT INTO managersystem.factoryinfo (factoryName, infoUpdateTime, contactInfo, address, remark) " +
  "VALUES (‘"+factoryName+"‘, ‘"+updateDate+"‘, ‘"+contactInfo+"‘, ‘"+factoryAdress+"‘, ‘"+remark+"‘);");
 }).then(function () {
 query("select * from managersystem.factoryinfo where factoryName=‘" +factoryName +"‘;").
 then(function (data) {
  var sql = "INSERT INTO managersystem.useractionrecords (`handleUserName`, ` handleTableName`, ` handleTableId`, `oldData`, `newData`, `action`, `dateTime`) " +
  "VALUES (‘" + handleUserName + "‘, ‘factoryinfo‘, ‘" + data.rows[0].id + "‘, null, ‘" + factoryName + "‘, ‘插入新数据‘, now());";
  query(sql);
  res.json({message:‘插入数据成功!‘});
 })
 }).catch(function (err) {console.log(err);});
});

  

 

使用Promise的感觉:

1、不用在每个回调函数中处理错误了,只需要在最后一个处理一下就好了,当然你可以在你想要处理的地方处理。

2、避免回调地狱,层层嵌套看得自己都恶心起来了。

在Node.js使用Promise的方式操作Mysql

标签:values   from   错误信息   factory   并且   嵌套   read   json   message   

热心网友 时间:2022-05-02 04:49

  Javascript的特点是异步,Javascript不能等待,如果你实现某件需要等待的事情,你不能停在那里一直等待结果回来,相反,底线是使用回调callback:你定义一个函数,这个函数只有等到结果可用时才能被调用。
  这种回调模型对于好的代码组织是没有问题的,但是也可以通过从原始回调切换到promise解决很多问题,将promise看成是一个标准的数据容器,这样会简化你的代码组织,可以成为基于promise的架构。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
有没有 感动的 青春校园 小故事 或是关于 舞蹈的励志 故事 或是其他... 天猫双11什么时候开始的?商家报名后需要做什么? 2023年的淘宝双11活动什么时候开始? 2023天猫双11活动什么时候开始 淘宝天猫2023双11活动玩法 组装电脑清单排名组装电脑清单 我想用8000元装个电脑,不要显示器和鼠标键盘,需要专业的回答!谢谢 八千块的电脑有什么配置8000元台式电脑最好的配置单 台式电脑组装8000左右8000元台式电脑最好的配置单 电脑主机配置清单8000元8000元台式电脑配置 iphone4视频在哪里? 新车用了风油精车漆掉了 QQ群机器人猜拳怎么赢? 找摩天大楼QQ群 有兴趣的朋友可以拉我 本人25级了 呵呵 可以开挂 本人QQ649078027 加下 谢谢 拉丁舞和爵士舞哪个整体减肥效果好(急用) qq群有人一直开挂刷群匿名主题怎么办? 幼儿学拉丁舞 爵士舞 民族舞哪个好 我现在已经13了,以前学过一点拉丁舞,学校有爵士舞和拉丁舞,不知道该选哪个好。能帮我提一下建议吗? 拉丁舞和爵士舞哪个会更好 求DNF江苏一区开挂刷图QQ群 爵士、拉丁、民族舞那个舞蹈好呢? 拉丁舞和爵士舞学哪个好?女孩10岁了。 学拉丁好还是爵士舞好点啊? 我19岁了,学拉丁好还是爵士好? 爵士舞和拉丁舞哪个更适合43岁阿姨 学爵士舞好还是拉丁舞? 买门锁去哪里买 上哪里买门锁 珠海哪里有专业买防盗锁的地方 杭州哪里有的买锁? 哪里有卖智能锁?推荐个品牌吧 梦见捡到透明舍利子 梦见在田地里面跑,回来时还背着被子,路上看见了大象,舍利子。有什么说法吗 有一个女孩子一直跟我说他手机坏了 我应该怎么回答不尴尬 我不想给他买手机? 怎样委婉的跟妈妈说手机坏了需要换一个? 怎么婉转的问别人手机怎么坏的 怎么可以让家人以为我的手机坏了,让家长买新的 如何找个借口说手机坏了 什么叫做性能力?! 女生说手机坏,该怎么回答? 性能力具体指哪些方面?持久性还是刚度 怎么把手机弄的人家以为坏了 手机坏了。 该怎么幽默回答她 跟男朋友说手机坏了 男朋友回了句我不会送你的 我该说什么 穿越林区线路巡视每年十二月至次年五月每多长时间巡视一次 性能力强是指什么强 跑步的时候适合听什么样的音乐?你推荐哪些曲目? 森林防火制度措施清单 肃北县生态公益林护林防火工作制度 女孩子说手机坏了怎么回答 我手机坏了,怎么跟父母说,这个情况很复杂