当前位置 : 主页 > 手机开发 > ROM >

promise详解

来源:互联网 收集:自由互联 发布时间:2021-06-10
Promise 是异步编程的一种解决方案,比传统的解决方案回调函数和事件相比,更合理和更强大,可以有效避免回调地狱。 传统ajax写法 ajax1({...,success(res1){ ...}})ajax2({..., params :{res1},succe

Promise 是异步编程的一种解决方案,比传统的解决方案回调函数和事件相比,更合理和更强大,可以有效避免回调地狱。

传统ajax写法

ajax1({...,success(res1){
    ...
}})

ajax2({...,params:{res1},success(res2){ // error no res1
    ...
}})

当我们的ajax2需要用到ajax1数据的时候,我们不得不使用嵌套式:

ajax1({...,success(res1){
    ajax2({...,params:{res1},success(res2){
        // doing something
    }})
}})

如果嵌套层级多话,将形成回调地狱,极难维护

 

promise写法

p1 = function() {
  return  new Promise(function(resolve){
        ajax1({...,success(res1){
            resolve(res1)
        }})
    })
}

p2 = function(){
   return new Promise(function(resolve){
        ajax2({...,params:{res1},success(res2){
            /// doing something
        }})
    })
}

改造后的写法

p1().then(res=>{
    return p2()
}).then(res2=>{
    // doing something
})

效果斐然

promise的核心特性

1. 一个 Promise 有 3 种状态:

  • pending: 初始状态,既不是成功,也不是失败状态。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失败。

  pending 状态的 Promise 可能会变为fulfilled 状态,也可能变为 rejected 状态

2. Promise 对象的状态,只有内部能够改变(而且只能改变一次),不受外界影响。

3. 对象的状态一旦改变,就不会再变,任何时候都可以得到这个结果。 Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。一旦状态发生改变,状态就凝固了,会一直保持这个结果。

const p = new Promise((resolve, reject)=>{
  resolve("resolved first time!"); // 只有第一次有效
  resolve("resolved second time!");
  reject("rejected!");
});
p.then(
  (data)=>console.log(data), 
  (error)=>console.log(error)
);

控制台打印

分享图片

Promise API

// 1. 构造方法
const p = new Promise((resolve, reject) => { /* executor*/
    // 1.1. Promise构造函数执行时立即调用 executor 函数;
    // 1.2. resolve 和 reject 函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)
    // 1.3. 如果在executor函数中抛出一个错误,那么该promise 状态为rejected。
    // 1.4. executor函数的返回值被忽略。
});

// 2.原型方法
Promise.prototype.catch(onRejected)
Promise.prototype.then(onFulfilled, onRejected)

// 3.静态方法
Promise.all(iterable);
Promise.race(iterable);
Promise.reject(reason);
Promise.resolve(value);

 自己实现promise
 待续。。。

  参考

Promise/A+:https://promisesaplus.com/

Promise/A+ 规范测试集:https://github.com/promises-aplus/promises-tests

阮一峰es6 Promise: http://es6.ruanyifeng.com/#docs/promise

手把手教你使用ts 一步一步的去完成一个Promise: https://juejin.im/post/5d078109e51d45108f254207

你真的会用 Promise 吗?:https://juejin.im/post/5cf7857ff265da1bac4005b2

网友评论