复习promise---node
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的更多相关文章
- Node复习
简单复习下node,不过很多重要的知识点是图,文字无法展示出来. 1.Node的特点 异步I/O 事件与回调函数 单线程 跨平台(libuv) 2.Node的应用场景 I/O密集型(事件循环.异步I/ ...
- Node.js最新技术栈之Promise篇
前言 大家好,我是桑世龙,github和cnodejs上的i5ting,目前在天津创业,公司目前使用技术主要是nodejs,算所谓的MEAN(mongodb + express + angular + ...
- 我们为什么使用Node
引言:Node 已经迅速成为一个可行并且真正高效的web 开发平台.在Node 诞生之前,在服务端运行JavasScript 是件不可思议的事情,并且对其他的脚本语言来说,要实现非阻塞I/O 通常需要 ...
- Node.js使用jszip实现打包zip压缩包
一.前言 最近有这样的一个需求,需要把两个同名的.mtl文件和.obj文件打包成一个同名的.zip压缩包.刚开始文件不多的时候,只有几个,或者十几个,甚至二三十个的时候,还能勉强接受手动修改,但是随着 ...
- ES6 - promise(1)
今天决定对之前学过的一些前端的知识进行梳理和总结,因为最近都是独自承担项目的开发与搭建,所以先从前后端交互的第一线axios来梳理,复习axios首先一定要先复习promise对象. 什么是promi ...
- NodeJS 入门第二天(EJS模板)
一.复习 复习:Node.js开发服务器,数据.路由.本地关心的效果,交互: Node.js实际上是极客开发出的一个小玩具,不是银弹.有着别人不具备的怪异特点: 单线程.Non-blocking I/ ...
- nodejs做中间层,转发请求
简述node中间层的优势 node中间层,可以解决前端的跨域问题,因为服务器端的请求是不涉及跨域的,跨域是浏览器的同源策略导致的,关于跨域可以查看跨域复习使用node坐中间层,方便前后端分离,后端只需 ...
- babeljs源码
babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...
- 深入理解jQuery、Angular、node中的Promise
最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...
- Node.js用ES6原生Promise对异步函数进行封装
Promise的概念 Promise 对象用于异步(asynchronous)计算..一个Promise对象代表着一个还未完成,但预期将来会完成的操作. Promise的几种状态: pending:初 ...
随机推荐
- 研究微信红包分配算法之Golang版
今天来看一下红包的分配,参考几年前流传的微信红包分配算法,今天用Golang实现一版,并测试验证结果. 微信红包的随机算法是怎样实现的?https://www.zhihu.com/question/2 ...
- vs 搭配 Linux 开发
这是一篇翻译,为什么突然想翻译文章了呢,因为很多大佬们都说英语对程序员还是挺重要的,毕竟互联网的最新技术基本都在歪果仁那边,如果英语不好,不会看国外的文档的话,将会错失接触第一手资料的机会,失去很多先 ...
- 基于Go的马蜂窝旅游网分布式IM系统技术实践
一.引言 即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商. 从商品复杂性来看,一个旅游商品可能会包括用户在未来一段时间的衣.食.住.行等方方面面.从消费金额来看,往往单次消费额度较大.对 ...
- 图像数组运算相关问题(nan/inf)
新年第一更!祝愿新的一年技术长足进步哈! 最近在用sklearn的回归分析模型拟合预测遥感图像,遇到了一些问题,好在一一解决,现在总结一下. 1.首先输入sklearn的数据必须reshape(-1, ...
- 某oa系统的审计
title: 某oa系统的审计 date: 2018-03-07 17:18:16 tags: --- 信呼OA 闲着没事,java学累了来整理下以前审的一个觉得很有意思的cms,这个作者写的比较灵活 ...
- PHP5.3的VC9、VC6、Thread Safe、Non Thread Safe的区别
PHP一共给了四个版本,VC9 x86 Non Thread Safe.VC9 x86 Thread Safe.VC6 x86 Non Thread Safe.VC6 x86 Thread Safe, ...
- HBASE手动触发major_compact
1.定时执行脚本#!/bin/bash source /etc/profile sh ./hbase shell <<EOF major_compact 'table_name' EOF ...
- aliyun---ossutil
上传文件: ossutil -c config cp -rf 源文件 oss://目标路径 config为存储key的文件 例子: ossutil -c config cp -rf /data/res ...
- phpstorm设置debug调试
先去下载xdebug.dll文件.将下面自己的phpinfo的文字信息复制到https://xdebug.org/wizard.php中,下载它提供的xdebug.dll的版本 下载完成后将php_x ...
- React之拆分组件与组件之间的传值
父子组件传值: 父组件向子组件传值通过向子组件TodoItem进行属性绑定(content={item}.index={index}),代码如下 getTodoItem () { return thi ...