promise这个东西,我都不知道见过多少回了!,非常重要,这里在回忆一遍

发现问题

const fs = require('fs')

fs.readFile('./data/1.txt', (err, data) => {
console.log(111)
fs.readFile('./data/2.txt', (err, data) => {
console.log(222)
fs.readFile('./data/3.txt', (err, data) => {
console.log(333)
})
})
}) // Promise

使用promise

/**
* Promise 在 Ecmascript 6 中体现出来就是一个对象
* Promise 是一个容器
* 一般用来封装一个异步操作
* 异步操作是一个无法预测的事情,要吗成功,要吗失败
* 容器内部有三种状态:
* pending 正在处理
* resolved 成功,已解决
* rejected 驳回,失败
*/ const fs = require('fs') // Promise 对象一经创建,立即执行
new Promise((resolve, reject) => {
fs.readFile('./data/2.txt', (err, data) => {
if (err) {
// 当 Promise 对象内部的异步操作结果失败的时候,告诉 Promise 对象容器,该异步任务失败了
// 其实就是将 Promise 内部的 Pending 状态改为 Rejected
reject(err)
}
// 当代码执行到这里,说明该 Promise 对象内部的异步操作没有错误发生,证明成功了
// 然后在这里将 Promise 内部的 Pending 状态改为 Resolved
resolve(data)
})
})
// Promise 实例对象有一个方法:then 方法
// then 需要传递两个回调处理函数
// 其中第一个回调处理函数就是 Promise 对象内部的 resolve 函数
// 第二个回调处理函数是可选的,如果传递则就是 Promise 对象内部的 reject 函数
.then((data) => {
console.log(111)
console.log(data.toString())
return new Promise((resolve, reject) => {
fs.readFile('./data/3.txt', (err, data) => {
if (err) {
// 这里没有使用 return 的原因就是 Promise 的状态只能从 Pending 变为 Resolve 或者 Rejected
// 状态一旦改变,就不会再发生变化
reject(err)
}
resolve(data)
})
})
}, (err) => {
console.log('读取文件失败了')
})
// then 方法之后可以继续链式调用 then
// 后续的每一个 then 中指定的回调处理函数都会被执行
// 后续的 then 中指定的回调处理函数可以接收上一个 then 中指定的成功的回调处理函数的返回结果
// 1. 没有返回值,默认就是 undefined
// 2. 有普通的返回值,数字、字符串、对象、数组。。。
// 3. 返回一个新的 Promise 对象
.then((data) => {
console.log(222)
console.log(data.toString())
return new Promise((resolve, reject) => {
fs.readFile('./data/1.txt', (err, data) => {
if (err) {
// 这里没有使用 return 的原因就是 Promise 的状态只能从 Pending 变为 Resolve 或者 Rejected
// 状态一旦改变,就不会再发生变化
reject(err)
}
resolve(data)
})
})
})
.then((data) => {
console.log(333)
// 二进制数据调用 toString() 方法可以转换为普通的字符,默认就是 utf8 编码
console.log(data.toString())
})

封装promise

const fs = require('fs')

readFile('./data/1.txt', 'utf8')
.then(data => {
console.log(data)
return readFile('./data/2.txt', 'utf8')
})
.then(data => {
console.log(data)
return readFile('./data/3.txt', 'utf8')
})
.then(data => {
console.log(data)
}) function readFile(...args) {
return new Promise((resolve, reject) => {
fs.readFile(...args, (err, data) => {
if (err) {
reject(err)
}
resolve(data)
})
})
}

html页面中promise

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>XMLHttpRequest - Promise</title>
</head>
<body>
<div>
姓名:
年龄:
</div>
<script> function xhr(options) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest()
xhr.open(options.type || 'get', options.url)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
resolve(xhr.responseText)
} else {
reject()
}
}
xhr.send()
})
} xhr({
url: '',
type: '',
data: ''
})
.then(data => {
return xhr({ })
})
.then(data => {
// 做渲染处理
}) $.ajax({ }).then(data => {
return $.ajax({ })
})
.then(data => { })
</script>
</body>
</html>

处理错误--最后

这种事把错误放在最后处理

当然,也可以在中间处理错误

不过一般都在最后处理

const fs = require('fs')

readFile('./data/4.txt', 'utf8')
.then(data => {
console.log(data)
return readFile('./data/2.txt', 'utf8')
})
.then(data => {
console.log(data)
JSON.parse('{dsadsa')
return readFile('./data/3.txt', 'utf8')
})
.then(data => {
console.log(data)
})
// 在使用 Promise 做异步流程控制的时候,关于异常的处理可以通过在最后一个 then 之后设置一个 catch
// 然后指定一个失败处理函数
// 该函数可以捕获前面所有的 Promise 对象本身以及 then 内部的任务错误
// 当前面任何一个发生异常,直接进入 catch,后续所有的 Promise 包括 then 不再执行
.catch(err => {
console.log(err)
}) function readFile(...args) {
return new Promise((resolve, reject) => {
fs.readFile(...args, (err, data) => {
if (err) {
reject(err)
}
resolve(data)
})
})
}

promise-resolve不支持多参数

复习promise---node的更多相关文章

  1. Node复习

    简单复习下node,不过很多重要的知识点是图,文字无法展示出来. 1.Node的特点 异步I/O 事件与回调函数 单线程 跨平台(libuv) 2.Node的应用场景 I/O密集型(事件循环.异步I/ ...

  2. Node.js最新技术栈之Promise篇

    前言 大家好,我是桑世龙,github和cnodejs上的i5ting,目前在天津创业,公司目前使用技术主要是nodejs,算所谓的MEAN(mongodb + express + angular + ...

  3. 我们为什么使用Node

    引言:Node 已经迅速成为一个可行并且真正高效的web 开发平台.在Node 诞生之前,在服务端运行JavasScript 是件不可思议的事情,并且对其他的脚本语言来说,要实现非阻塞I/O 通常需要 ...

  4. Node.js使用jszip实现打包zip压缩包

    一.前言 最近有这样的一个需求,需要把两个同名的.mtl文件和.obj文件打包成一个同名的.zip压缩包.刚开始文件不多的时候,只有几个,或者十几个,甚至二三十个的时候,还能勉强接受手动修改,但是随着 ...

  5. ES6 - promise(1)

    今天决定对之前学过的一些前端的知识进行梳理和总结,因为最近都是独自承担项目的开发与搭建,所以先从前后端交互的第一线axios来梳理,复习axios首先一定要先复习promise对象. 什么是promi ...

  6. NodeJS 入门第二天(EJS模板)

    一.复习 复习:Node.js开发服务器,数据.路由.本地关心的效果,交互: Node.js实际上是极客开发出的一个小玩具,不是银弹.有着别人不具备的怪异特点: 单线程.Non-blocking I/ ...

  7. nodejs做中间层,转发请求

    简述node中间层的优势 node中间层,可以解决前端的跨域问题,因为服务器端的请求是不涉及跨域的,跨域是浏览器的同源策略导致的,关于跨域可以查看跨域复习使用node坐中间层,方便前后端分离,后端只需 ...

  8. babeljs源码

    babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...

  9. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  10. Node.js用ES6原生Promise对异步函数进行封装

    Promise的概念 Promise 对象用于异步(asynchronous)计算..一个Promise对象代表着一个还未完成,但预期将来会完成的操作. Promise的几种状态: pending:初 ...

随机推荐

  1. @ComponentScan注解,basePackages参数通配符

    @ComponentScan(basePackages = "com.ofo.test")当basePackages的直使用通配符,使用**,不能使用*.引用:https://bl ...

  2. WeChall_Training: Encodings I (Training, Encoding)

    We intercepted this message from one challenger to another, maybe you can find out what they were ta ...

  3. Codeforces 1064D Labyrinth(双端队列BFS)

    题意: 给一个图,"*"不可以走,给你一个起点,限制向左走L次,向右走R次,上下不限制,问你最多可以走到多少个格子 思路: BFS,每次将上下走的策略加入队首,左右加入队尾,(相当 ...

  4. 用户登录并返回token(springboot)

    何为token?[如果想直接看代码可以往下翻] 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的:1. 客户端使用用户名跟密码请求登录2. 服务端收到请求,去 ...

  5. Django请求过程

  6. Shell脚本 统计店中店导出数据

    有一个数据文件  yue.csv  是这样的   #head yue.csv  日期,商家名称,要求在线数,当天在线数,要求在线时长,在线时长达标数,   ……"2017-12-31&quo ...

  7. JVM性能优化系列-(5) 早期编译优化

    5. 早期编译优化 早起编译优化主要指编译期进行的优化. java的编译期可能指的以下三种: 前端编译器:将.java文件变成.class文件,例如Sun的Javac.Eclipse JDT中的增量式 ...

  8. Flutter Widgets 之 InkWell 和 Ink

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 InkWell InkWell组件在用户点击时出现&quo ...

  9. webpack nodejs npm关系

    nodejs是js后端运行平台,可以把它看成java体系中对应的jdk,是三个里面最基础的.npm是nodejs的包管理工具,可以把它看成maven中包依赖管理那部分.webpack是前端工程化打包工 ...

  10. RJM8L151F6P6温度枪方案对比

    疫情当下,温度计.呼吸机.监护仪.制氧机等医疗产品的生产供应至关重要,红外温度计属于非接触式测温,它是利用物体热辐射与物体温度之间的关系来工作的. 红外测温仪是一种将红外技术与微电子技术相结合的新型温 ...