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. Struts2 让跳转指定执行某个方法

    很多时候,我们想让jsp页面中的某个超链接,点击后执行后台的某个方法,里面该如何做呢? 这里方法很多种 我举例两种: 1.在struts.xml配置,配置如下: <package name=&q ...

  2. POJ3295 Tautology(栈+枚举)

    Description WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some ...

  3. The Suspects——Asia Kaohsiung 2003

    原创 The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 48698 Accepted: 23286 Des ...

  4. PrintDocument or PrintPreviewDialog 打印

    /// <summary> /// /// </summary> /// <param name="sender"></param> ...

  5. 模板方法(Template Method)模式

    /* * 抽象模版(AbstractClass)角色有如下的责任: 定义了一个或多个抽象操作,以便让子类实现.这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤. 定义并实现了一个模版方法.这个模 ...

  6. web利用table表格生成excel格式问题

    当我们把web页面上的table导成excel形式时,有时候我们的数据需要以特定的格式呈现出来,这时候我们就需要给指定的单元格添加一些样式规格信息. 文本:vnd.ms-excel.numberfor ...

  7. MySql8.0后密码认证方式问题[caching-sha2-password]

    这个问题通常在laravel中表现为类似下边的异常: local.ERROR: SQLSTATE[HY000] [2006] MySQL server has gone away {"exc ...

  8. NSValue 值

    前言 将任意数据类型包装成 OC 对象 1.比较两个 NSValue 类型数据的大小 NSValue *value1 = [NSValue valueWithPoint:NSMakePoint(10, ...

  9. Launch VINS example (Euroc dataset) in RTAB-MAP

    $ roslaunch rtabmap_ros euroc_datasets.launch args:="-d RGBD/CreateOccupancyGrid false Odom/Str ...

  10. 649. Dota2 Senate

    In the world of Dota2, there are two parties: the Radiant and the Dire. The Dota2 senate consists of ...