Promise第一版本

案例是使用Node.js内置的fs模块[就是文件系统模块,负责读写文件。]来模拟异步操作

const fs = require('fs');
function getFilePath(fpath) {
let p = new Promise(function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
}) });
return p } let p = getFilePath('./src/main.js');
p.then(
function (data) {
console.log('-----------------' +data + '---------------')
},
function (err) {
console.log(err.message) })

Promise 第二版本

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
}
) } getFilePath('./src/main.js')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
},
function (err) {
console.log(err.message)
}
)

新的需求: 依次读取 1.txt --> 2.txt --> 3.txt

第一版

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
}
) } getFilePath('./1.txt')
.then(function (data) {
console.log('-----------------' + data + '---------------') getFilePath('./2.txt')
.then(function (data) {
console.log('-----------------' + data + '---------------') getFilePath('./3.txt')
.then(function (data) {
console.log('-----------------' + data + '---------------') }) })
})

第二版

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
}
) } getFilePath('./1.txt')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./2.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./3.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
})

新需求 捕获过程中的错误 不影响后面的Promise正常执行

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err);
resolve(dataStr)
})
}
) } getFilePath('./没有这个文件.txt')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./2.txt') }, function (err) {
console.log(err.message)
return getFilePath('./2.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./3.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
})

新需求 后面的执行以来前面的结果,当前面失败立即终止,并捕获错误

const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err);
resolve(dataStr)
})
}
) } getFilePath('./1.txt')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./2.txt') })
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./22.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./3.txt')
})
.catch(function (err) {
console.log('【自己】捕获到的错误'+ err.message)
})

上面那样写不太优雅,来个终极版

const fs = require('fs');

function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err);
resolve(dataStr)
})
}
) } Promise.all([getFilePath('./1.txt'), getFilePath('./不存在.txt'), getFilePath('./1.txt')])
.then(datas => {
console.log(datas);
})
.catch(err => {
console.log(err)
})

小结:

  • Vue中的vue-resource(官方已经不推荐使用)和axios都是基于Promise的,完全继承了Promise的特性,看过文档后分分钟可以上手
  • axios中的http请求实现不需要在自己写逻辑了 ,直接调用它的api就可以

Promise个人笔记---【Promise的前世今生】的更多相关文章

  1. es6学习笔记--promise对象

    Promise对象是为了简化异步编程.解决回调地狱情况 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可 ...

  2. js的Promise学习笔记(1)

    1: 何为Promise Promise是抽象异步处理对象以及对其对象进行各种操作的组件,是基于并列/并行处理设计的一种编程语言. 说到基于JavaScript的异步处理,大多数都会想到利用回调函数. ...

  3. Promise 学习笔记

    所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise是一个对象,从它可以获取异步操作的消息.Promise提供统一的API, ...

  4. JavaScript之Promise学习笔记

    一直想知道Promise到底是怎么实现的,网上一搜几十篇文章,看的一脸蒙蔽.最后算是找到几个讲的真心很详细明了的.看了一份源码看了很久很久……最后找大佬问了几处看不懂的地方,大佬只看了十几分钟就看懂了 ...

  5. js-ES6学习笔记-Promise对象(2)

    1.Promise实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的.它的作用是为Promise实例添加状态改变时的回调函数. 2.Promise.pr ...

  6. 《深入理解ES6》笔记—— Promise与异步编程(11)

    为什么要异步编程 我们在写前端代码时,经常会对dom做事件处理操作,比如点击.激活焦点.失去焦点等:再比如我们用ajax请求数据,使用回调函数获取返回值.这些都属于异步编程. 也许你已经大概知道Jav ...

  7. ES6-11学习笔记--Promise

    Promise是ES6异步编程解决方案之一,简化以前ajax的嵌套地狱,增加代码可读性.   基本用法: resolve,成功 reject,失败 let p = new Promise((resol ...

  8. Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)

    1.什么是Promise? Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数 事件监听 发布/ ...

  9. 理解Promise.all,Promise.all与Promise.race的区别,如何让Promise.all在rejected失败后依然返回resolved成功结果

     壹 ❀ 引 我在 es6入门4--promise详解 这篇文章中有详细介绍Promise对象的用法,文章主题更偏向于对于Promise概念的理解与各方法基本使用介绍:而世上一个比较有趣的问题就是,即 ...

  10. ES6---new Promise()讲解,Promise对象是用来干嘛的?

    ES6---new Promise()讲解,Promise对象是用来干嘛的? :https://blog.csdn.net/Wbiokr/article/details/79490390

随机推荐

  1. javascrip总结12:逻辑运算符与等号运算符

    1 逻辑运算符 逻辑运算的结果只有true 或者 false. 1.1 与&&: 两个表达式为true的时候,结果为true. 1.2 或|| 只要有一个表达式为true,结果为tru ...

  2. MySQL性能调优与架构设计——第5章 备份与恢复

    第5章 备份与恢复 前言 数据库的备份与恢复一直都是 DBA 工作中最为重要的部分之一,也是基本工作之一.任何正式环境的数据库都必须有完整的备份计划和恢复测试,本章内容将主要介绍 MySQL数据库的备 ...

  3. linux下SVN服务器配置

    SVN服务器配置 1. 安装svn服务 yum install subversion 2. 新建一个目录用于存储SVN所有文件 mkdir /home/svn 3. 创建项目 在上面创建的文件夹中为项 ...

  4. 如何杀死一个已经detached的screen会话?

    如果向杀死一个已经detached的screen会话,可以使用以下命令: screen -X -S seesion-id quit 举例如下: [root@localhost ~]# screen - ...

  5. 国外物联网平台(4):Ayla Networks

    国外物联网平台(4)——Ayla Networks 马智 定位 Ayla企业软件解决方案为全球部署互联产品提供强大的工具 功能 Ayla的IoT平台包含3个主要组成部分: (1) Ayla嵌入式代理A ...

  6. C#委托同步异步说明,并比较control调用Invoke和BeginInvoke的异同

    一.委托的同步和异步: 1.同步 使用Invoke调用同步,或直接写fun1("func"),在fun1.Invoke这一步会明显的阻塞线程 使用: static void Mai ...

  7. 搭建基于MinGW平台的《OpenGL蓝皮书(OpenGL SuperBibe 5th)》示例代码编译环境

    副标题:搭建基于MinGW平台的<OpenGL超级宝典>(OpenGL蓝皮书第5版)GLTools 编译环境.示例代码:Triangle.cpp @ SB5.zip 以下内容以及方法均参考 ...

  8. Selenium API(二)

    1.定位一组元素 WebDriver提供了8种定位一组元素的方法. driver.find_elements_by_css_selector() driver.find_elements_by_tag ...

  9. 汇编Shellcode的技巧

    汇编Shellcode的技巧 来源  https://www.4hou.com/technology/3893.html 本文参考来源于pentest 我们在上一篇提到要要自定义shellcode,不 ...

  10. 移动端适配video适配

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...