node.js--promise
2021/4/11 14:26:23
本文主要是介绍node.js--promise,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Promise
callback hell(回调地狱):
文件的读取无法判断执行顺序(文件的执行顺序是依据文件的大小来决定的)(异步api无法保证文件的执行顺序)
var fs = require('fs'); fs.readFile('./data/a.text','utf8',function(err,data){ if(err){ // 1 读取失败直接打印输出读取失败 return console.log('读取失败'); // 2 抛出异常 // 阻止程序的执行 // 把错误信息打印到控制台 throw err; } console.log(data); }); fs.readFile('./data/b.text','utf8',function(err,data){ if(err){ // 1 读取失败直接打印输出读取失败 return console.log('读取失败'); // 2 抛出异常 // 阻止程序的执行 // 把错误信息打印到控制台 throw err; } console.log(data); });
通过回调嵌套的方式来保证顺序:
var fs = require('fs'); fs.readFile('./data/a.text','utf8',function(err,data){ if(err){ // 1 读取失败直接打印输出读取失败 return console.log('读取失败'); // 2 抛出异常 // 阻止程序的执行 // 把错误信息打印到控制台 throw err; } console.log(data); fs.readFile('./data/b.text','utf8',function(err,data){ if(err){ // 1 读取失败直接打印输出读取失败 return console.log('读取失败'); // 2 抛出异常 // 阻止程序的执行 // 把错误信息打印到控制台 throw err; } console.log(data); fs.readFile('./data/a.text','utf8',function(err,data){ if(err){ // 1 读取失败直接打印输出读取失败 return console.log('读取失败'); // 2 抛出异常 // 阻止程序的执行 // 把错误信息打印到控制台 throw err; } console.log(data); }); }); });
为了解决以上编码方式带来的问题(回调地狱嵌套),所以在EcmaScript6新增了一个API:Promise
。
- Promise:承诺,保证
- Promise本身不是异步的,但往往都是内部封装一个异步任务
基本语法:
// 在EcmaScript 6中新增了一个API Promise // Promise 是一个构造函数 var fs = require('fs'); // 1 创建Promise容器 resolve:解决 reject:失败 var p1 = new Promise(function(resolve, reject) { fs.readFile('./a.text', 'utf8', function(err, data) { if (err) { // console.log(err); // 把容器的Pending状态变为rejected reject(err); } else { // console.log(data); // 把容器的Pending状态变为resolve resolve(1234); } }); }); // 当p1成功了,然后就(then)做指定的操作 // then方法接收的function就是容器中的resolve函数 p1 .then(function(data) { console.log(data); }, function(err) { console.log('读取文件失败了', err); });
封装Promise的readFile
:
var fs = require('fs'); function pReadFile(filePath) { return new Promise(function(resolve, reject) { fs.readFile(filePath, 'utf8', function(err, data) { if (err) { reject(err); } else { resolve(data); } }); }); } pReadFile('./a.txt') .then(function(data) { console.log(data); return pReadFile('./b.txt'); }) .then(function(data) { console.log(data); return pReadFile('./a.txt'); }) .then(function(data) { console.log(data); })
mongoose所有的API都支持Promise:
// 查询所有 User.find() .then(function(data){ console.log(data) })
注册:
User.findOne({username:'admin'},function(user){ if(user){ console.log('用户已存在') } else { new User({ username:'aaa', password:'123', email:'fffff' }).save(function(){ console.log('注册成功'); }) } })
User.findOne({ username:'admin' }) .then(function(user){ if(user){ // 用户已经存在不能注册 console.log('用户已存在'); } else{ // 用户不存在可以注册 return new User({ username:'aaa', password:'123', email:'fffff' }).save(); } }) .then(funciton(ret){ console.log('注册成功'); })
这篇关于node.js--promise的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-30React Native常用组件-点击组件
- 2024-05-30uniapp+vue3+uv-ui手机端后台OA管理模板
- 2024-05-29Python网络爬虫的时候json=就是让你少写个json.dumps()
- 2024-05-27React Native常用组件-展示组件
- 2024-05-27React Native常用组件-列表组件
- 2024-05-09vue3开发前端表单缓存自定义指令,移动端h5必备插件
- 2024-05-09React Hooks在class组件中的使用方式
- 2024-03-30[OIDC in Action] 2. 基于OIDC(OpenID Connect)的SSO(纯JS客户端)
- 2024-03-29terraform jsonencode
- 2024-03-13vuex-persist