关于异步和同步

同步和异步链接

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相关推荐

  1. Node --- Promise中的多异步协作

    当我们需要处理多个异步调用时,应该如何处理呢? //首先假设有2个读取文件的异步调用,promise1和promise2 var promise1 = readFile ("foo.txt& ...

  2. 使用 Node 开发一个多人对战的射击游戏

    点击上方 前端瓶子君,关注公众号 回复算法,加入前端编程面试算法每日一题群 来源:我系小西几呀 https://juejin.cn/post/6960096410305822751 相信大家都是知道游 ...

  3. Node 开发一个多人对战的射击游戏(实战长文)

    点击上方 程序员成长指北,关注公众号 回复1,加入高级 Node 进阶交流群 来源:我系小西几呀 https://juejin.cn/post/6960096410305822751 相信大家都是知道 ...

  4. ts promise

    const fs = require("fs"); console.log("hello");// fs.readFile(path, (err,data)={ ...

  5. ES6 ------ 基础(三)——Promise 基本使用

    Promise 基本使用 Promise 是 ES6 引入的解决异步编程的新解决方案.语法上 Promise 是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果. Promise 构造函数: ...

  6. ES6 Proxy 性能之我见

    ES6 Proxy 性能之我见 本文翻译自https://thecodebarbarian.com/thoughts-on-es6-proxies-performance Proxy是ES6的一个强力 ...

  7. 「万字总结」熬夜总结50个JS的高级知识点,全都会你就是神

    前言 大家好,我是林三心,基础是进阶的前提,上一篇,我给大家分享了我这一年来平时记录的工作中碰到的50个JS基础知识点,今天就给大家分享一下,我这一年来,工作中遇到的50个JS高级知识点吧!!! 知识 ...

  8. css+gsap+vue实现背景图标放烟花/天女散花/随机发散效果

    效果 前言 gsap 基础这里不做多详述,可以先学习此文: < gsap.js 的简单应用--页面加载文字弹出效果> 了解 gsap.to() 的使用方法. 实现 基础图标 基础图标即-- ...

  9. Vue信息聊天框首次进入有图片加载滚动到最底部

    场景:我们有个聊天室,进入聊天室的话我们的需求是,进入聊天室,滚动到最新信息底部,如果是文字的话,很简单,异步获取数据,然后设置滚动高度即可,我们的使用的是VUE,我们先来操作一下: <temp ...

  10. js---宏观任务和微观任务

    一.什么是宏观任务和微观任务 任务可以分为同步任务和异步任务:异步任务又可以分为宏观任务和微观任务,自从es6后,js引擎也可以发布异步任务. 宏观任务:通过浏览器.node.js等宿主环境来请求 微 ...

最新文章

  1. JDK17 要来了!会带来什么新特性?不好意思,我还在JDK7 踏步走...
  2. 使用Lex和Yacc开发C语言的编译器
  3. 如果你没有考上985,没有考上211……
  4. Codeforces Round #315 (Div. 2)
  5. postgresql后期给开发建表的权限问题
  6. oracle开窗函数是什么,ORACLE数据库(六)-----开窗函数
  7. matlab colorbar采用对数,matlab colorbar的使用 | 學步園
  8. 东莞.NET技术线下沙龙活动资料分享
  9. 一个带新闻,天气的时钟Widget(三)---Webservices篇
  10. python作者_Python
  11. Apex-逃离塔科夫机器码彻底解决(年度最新讲解可观看)
  12. 1、Swing简介:Swing是什么?
  13. python 使用 requests 库发送请求及设置代理
  14. Revit二次开发_1.过滤器笔记篇
  15. vb.net 简单取摄像头图片_【图片】大车监控如何安装?_大车监控吧
  16. 现代女生令我们如此失望
  17. 下拉推荐在 Shopee Chatbot 中的探索和实践
  18. 乔布斯往事:游戏之神卡马克眼中的“英雄和傻瓜”
  19. 不同windows服务器之间同步文件,WindowsServer2016配置DFS实现两个服务器之间文件同步...
  20. 七年级计算机课计划,初中信息技术教学计划范文(通用5篇)

热门文章

  1. 终于有了自己的域名了
  2. HDU1240 POJ2225 Asteroids!【BFS】
  3. CCF201312-4 有趣的数(100分)
  4. 模式识别经典算法——FCM图像聚类分割(最简matlab实现)
  5. 【数值分析】—— 对数函数、指数函数(数值稳定性)
  6. 推理集 —— 物品与动物
  7. 学计算机高考分数线,2020高考分数线预测
  8. thinkphp5 图片压缩旋转_有非常多的图片,该怎么制作PPT?
  9. python朗读文本_python文本操作—读、写
  10. python下载-Python下载和安装图文教程[超详细]