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. pdo数据操作,3-4,0724

    require 'connect.php'; $linshi = $dbh->prepare('UPDATE `category` SET `name` = :name, `alias`=:al ...

  2. POJ 1751 Highways(最小生成树Prim普里姆,输出边)

    题目链接:点击打开链接 Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has ...

  3. XXE漏洞复现步骤

    XXE漏洞复现步骤 0X00XXE注入定义 XXE注入,即XML External Entity,XML外部实体注入.通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远 ...

  4. 从Golang中open的实现方式看Golang的语言设计

    Golang有很多优点: 开发高效:(C语言写一个hash查找很麻烦,但是go很简单) 运行高效:(Python的hash查找好写,但比Python高效很多) 很少的系统库依赖:(环境依赖少,一般不依 ...

  5. postfix 被当作垃圾邮件中转站

    磁盘 io 总是满的状态 该服务器只有监控和邮件elk在上面. 发现邮件日志 疯狂的输出 tail -f /var/log/maillog 大致都是来自于 yahoo.com.tw的东西 清空了 /v ...

  6. [Python]执行Linux命令

    使用subprocess模块 import subprocess # 防火墙服务存在关闭状态 child1 = subprocess.Popen(["systemctl status fir ...

  7. 在线使用iconfont字体图标

    登录https://www.iconfont.cn 把需要的图标加入购物车,然后加入项目 打开我的项目,生成代码 有3中方式使用图标 unicode和font class本质都是使用字体,好处在于兼容 ...

  8. Emmet:HTML/CSS代码快速编写

    html缩写: 1.  初始化 HTML文档需要包含一些固定的标签,比如<html>.<head>.<body>等,现在你只需要1秒钟就可以输入这些标签.比如输入“ ...

  9. 关于宏MACRO,我们需要知道的事

    一.先从最宏观的角度来了解宏,这里的宏观角度是指程序的运行流程: 1,提交代码后,SAS先把代码读取储存到堆栈中: 2,用文本扫描插件来扫描堆栈中的代码,从上到下,从左到右: 3,扫描到一个分号,则编 ...

  10. Serverless + Egg.js 后台管理系统实战

    本文将介绍如何基于 Egg.js 和 Serverless 实现一个后台管理系统 作为一名前端开发者,在选择 Nodejs 后端服务框架时,第一时间会想到 Egg.js,不得不说 Egg.js 是一个 ...