Promise笔记

笔记

异步编程

  • fs 文件操作
1
require('fs').readFile('./index.html',(err,data)=>{})
  • 数据库操作
  • ajax
1
$.get('/server/',(data)=>{})
  • 定时器
1
setTimeout(()=>{},2000);

util.promisify方法

promisify方法可以把不是promise的方法变成promise方法
条件:

  • 回调函数必须是主函数中参数位置的最后一个
  • 回调函数中第一个参数必须是error

https://www.cnblogs.com/ikcamp/p/7767818.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 原有的callback调用
fs.readFile('test.js', function(err, data) {
if (!err) {
console.log(data);
} else {
console.log(err);
}
});

// promisify后
var readFileAsync = promisify(fs.readFile);
readFileAsync('test.js').then(data => {
console.log(data);
}, err => {
console.log(err);
});

Promise的状态

实力对象中的一个属性 [PromiseState]

  • pending 未决定的
  • resolved / fullfiled 成功
  • reject 失败

Promise 对象的值

实例对象中的另一个属性 [PromiseResult]
保存着异步任务 [成功/失败] 的结果

  • resolve
  • reject

Promise构造函数 Promise(executor){}

  1. executor函数:执行器(resolve,reject)=>{}
  2. resolve函数:内部定义成功时我们调用函数value=>{}
  3. reject函数:内部定义失败时我们调用的函数reason=>{}
    说明:executor会在promise内部立即同步调用 异步操作在执行器中执行

Promise.prototype.then 方法(onResolved,onRejected)=>{}

  1. onResolved函数: 成功的回调函数(value)=>{}
  2. onRejected函数: 失败的回调函数(reason)=>{}
    说明: 指定用于得到成功value的成功回调和用于得到失败reason的失败回调返回一个新的promise对象

Promise.prototype.catch方法(onRejected)=>{}

  1. onRejected函数:失败的回调函数(reason)=>{}

Promise.resolve方法 (这个方法不属于实例对象)(value)=>{}

  1. value: 成功的数据或者promise对象
    说明: 返回一个成功/失败的promise对象

Promise.reject方法 (reason)=>{}

  1. reason:失败的原因
    说明:返回一个失败的promise对象

Promise.all方法(promises)=>{}

  1. promises 包含n个promise的数组
    说明:返回一个新的promise,只有所有promise都成功才成功,只要有一个失败了就直接失败
    成功了返回每一个promise对象组成的数组 失败了返回这一组promise中失败promise的失败reason

Promise.race 方法(promises)=>{}

  1. promises 包含n个promise的数组
    说明:返回一个新的promise,第一个完成的promise结果状态就是最终的结果状态

如何改变promise的状态

  1. resolve(value):如果当前是pending就会变成resolved
  2. reject(reason):如果当前是pending就会变成rejected
  3. 抛出异常:如果当前是pending就会变成rejected

一个promise指定多个成功/失败回调函数 都会调用吗

当promise改变为对应状态时都会调用

如何先改变状态在指定回调

  1. 在执行器中直接调用resolve()/reject()
  2. 延迟更长时间在调用then()

promise.then()返回的新promise的结果状态由什么决定

  1. 简单表达 由then()指定的回调函数执行的结果决定
  2. 详细表达
    1. 如果抛出异常 新promise变成rejected,reason为抛出的异常
    2. 如果返回的是非promise的任意值,新promise变为resolved,value为返回的值
    3. 如果返回的是另一个新的promise 此promise的结果就会成为新promise的结果

promise如何串联多个操作任务

  1. promise的then()返回一个新的promise 可以开成then()的链式调用
  2. 通过then的链式调用串联多个同步/异步任务