Node-Promise
关于异步和同步
同步和异步链接
Promise简介
- Promise对象可以解决回调地狱的问题
回调地狱:如果我们希望几个异步请求按照顺序来执行,那么就需要将这些异步操作嵌套起来,嵌套的层数特别多,就会形成回调地狱 或者叫做 横向金字塔。
异步请求嵌套还有一个问题就是性能问题。也就是所需时间过多,基本上失去了异步任务的特点
- Promise 是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大
Promise可以理解为一个容器,里面可以编写异步程序的代码
- 从语法上说,Promise 是一个对象,使用的使用需要
new
Promise使用
第一部分:包装异步任务
let p = new Promise((resolve, reject) => {// 形参resolve,单词意思是 完成// 形参reject ,单词意思是 失败// 这里放异步任务,把异步任务成功的结果传递给resolve,失败传给rejextfs.readFile('./a.txt',(err,data)=>{err? reject(err):resolve(data.length) })
});
第二部分:获取异步任务结果
// p.then(函数1,函数2)
// 函数1:相当于前面的resolve 用于取得成功的结果
// 函数2:相当于前面的reject函数,用于取得失败的错误信息,函数2可选
p.then((r)=>{console.log(r)//r就是前面resolve函数传递过来的结果
},(err)=>{console.log(err)
})
promise对象后面都可以加catch
特点
简单来说就是多次调用 resolve 函数,只有第一次有效,其他的调用都无效。
const fs = require('fs');
// 1. 包装异步任务
let p = new Promise((resolve, reject) => {resolve(123);resolve(456); // 这次调用无效
});// 2. 获取异步任务的结果
p.then(res => {console.log(res); // 123
}, err => {console.log(err);
});
- new Promise是同步执行的
- 获取结果时(调用 resolve 触发 then方法时)是异步的
then方法的链式调用
- 前一个then里面返回的字符串,会被下一个then方法接收到。但是没有意义;
- 前一个then里面返回的Promise对象,并且调用resolve的时候传递了数据,数据会被下一个then接收到
- 前一个then里面如果没有调用resolve,则后续的then不会接收到任何值
const fs=require('then-fs')
let p=fs.readFile('./a.txt')
let p1=fs.readFile('./b.txt')
p.then((r)=>{console.log(r.length)//r就是前面resolve函数传递过来的结果return p1
}).then((r1)=>{console.log(r1.length)
}).catch((err) => {//catch 方法可以统一获取错误信息console.log(err);
});
异步读取文件
第一种:封装函数
function myReadFile(path) {return new Promise((resolve, reject) => {fs.readFile(path, 'utf-8', (err, data) => {err ? reject(err) : resolve(data.length);})});
}myReadFile('./a.txt')
.then(a => {console.log(a);return myReadFile('./b.txt');
})
.then(b => {console.log(b);return myReadFile('./c.txt');
})
.then(c => {console.log(c)
})
.catch((err) => {console.log(err);
});
第二种:使用第三方模块读取文件
1.初始化 npm init - y
2.安装模块 npm i then-fs
3.读取文件后,返回 Promise 对象
4.修改 package.json ,添加 “type”: “module” 表示使用ES6的模块化语法
实例:
终端进行的操作:
1.初始化 npm init - y
2.安装模块 npm i then-fs
3.读取文件后,返回 Promise 对象
const fs=require('then-fs')
let p=fs.readFile('./a.txt')
let p1=fs.readFile('./b.txt')
p.then((r)=>{console.log(r.length)//r就是前面resolve函数传递过来的结果return p1
}).then((r1)=>{console.log(r1.length)
}).catch((err) => {console.log(err);
});
4.修改 package.json ,添加 “type”: “module” 表示使用ES6的模块化语法
async 和 await 修饰符
async 用于修饰一个 function
语法: let value = await promise对象;
const fs = require('fs');
// 将异步读取文件的代码封装
function myReadFile (path) {return new Promise((resolve, reject) => {fs.readFile(path, 'utf-8', (err, data) => {err ? reject(err) : resolve(data.length);});}).catch(err => {console.log(err);});//对于错误处理,可以选择在async函数后面使用 `.catch()` 或 在promise对象后使用 `.catch()`
}async function abc () {let a = await myReadFile('./a.txt');console.log(a);
}abc();
由于await需要等待promise执行完毕,所以await会暂停函数的执行,但不会影响其他同步任务
Node-Promise相关推荐
- Node --- Promise中的多异步协作
当我们需要处理多个异步调用时,应该如何处理呢? //首先假设有2个读取文件的异步调用,promise1和promise2 var promise1 = readFile ("foo.txt& ...
- 使用 Node 开发一个多人对战的射击游戏
点击上方 前端瓶子君,关注公众号 回复算法,加入前端编程面试算法每日一题群 来源:我系小西几呀 https://juejin.cn/post/6960096410305822751 相信大家都是知道游 ...
- Node 开发一个多人对战的射击游戏(实战长文)
点击上方 程序员成长指北,关注公众号 回复1,加入高级 Node 进阶交流群 来源:我系小西几呀 https://juejin.cn/post/6960096410305822751 相信大家都是知道 ...
- ts promise
const fs = require("fs"); console.log("hello");// fs.readFile(path, (err,data)={ ...
- ES6 ------ 基础(三)——Promise 基本使用
Promise 基本使用 Promise 是 ES6 引入的解决异步编程的新解决方案.语法上 Promise 是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果. Promise 构造函数: ...
- ES6 Proxy 性能之我见
ES6 Proxy 性能之我见 本文翻译自https://thecodebarbarian.com/thoughts-on-es6-proxies-performance Proxy是ES6的一个强力 ...
- 「万字总结」熬夜总结50个JS的高级知识点,全都会你就是神
前言 大家好,我是林三心,基础是进阶的前提,上一篇,我给大家分享了我这一年来平时记录的工作中碰到的50个JS基础知识点,今天就给大家分享一下,我这一年来,工作中遇到的50个JS高级知识点吧!!! 知识 ...
- css+gsap+vue实现背景图标放烟花/天女散花/随机发散效果
效果 前言 gsap 基础这里不做多详述,可以先学习此文: < gsap.js 的简单应用--页面加载文字弹出效果> 了解 gsap.to() 的使用方法. 实现 基础图标 基础图标即-- ...
- Vue信息聊天框首次进入有图片加载滚动到最底部
场景:我们有个聊天室,进入聊天室的话我们的需求是,进入聊天室,滚动到最新信息底部,如果是文字的话,很简单,异步获取数据,然后设置滚动高度即可,我们的使用的是VUE,我们先来操作一下: <temp ...
- js---宏观任务和微观任务
一.什么是宏观任务和微观任务 任务可以分为同步任务和异步任务:异步任务又可以分为宏观任务和微观任务,自从es6后,js引擎也可以发布异步任务. 宏观任务:通过浏览器.node.js等宿主环境来请求 微 ...
最新文章
- JDK17 要来了!会带来什么新特性?不好意思,我还在JDK7 踏步走...
- 使用Lex和Yacc开发C语言的编译器
- 如果你没有考上985,没有考上211……
- Codeforces Round #315 (Div. 2)
- postgresql后期给开发建表的权限问题
- oracle开窗函数是什么,ORACLE数据库(六)-----开窗函数
- matlab colorbar采用对数,matlab colorbar的使用 | 學步園
- 东莞.NET技术线下沙龙活动资料分享
- 一个带新闻,天气的时钟Widget(三)---Webservices篇
- python作者_Python
- Apex-逃离塔科夫机器码彻底解决(年度最新讲解可观看)
- 1、Swing简介:Swing是什么?
- python 使用 requests 库发送请求及设置代理
- Revit二次开发_1.过滤器笔记篇
- vb.net 简单取摄像头图片_【图片】大车监控如何安装?_大车监控吧
- 现代女生令我们如此失望
- 下拉推荐在 Shopee Chatbot 中的探索和实践
- 乔布斯往事:游戏之神卡马克眼中的“英雄和傻瓜”
- 不同windows服务器之间同步文件,WindowsServer2016配置DFS实现两个服务器之间文件同步...
- 七年级计算机课计划,初中信息技术教学计划范文(通用5篇)