美文网首页
Promise详解

Promise详解

作者: fayeLiao | 来源:发表于2018-12-07 10:08 被阅读0次

Promise对象

1.Promise是什么

1)含义
  • 英译: 承诺
  • 是一个对象
  • 用来传递异步信息
  • 代表未来才会知道结果的事件(异步操作)
2)特点
  • 对象的状态不受外界的影响

Promise有3种状态:Pending(进行中) => Resolved(已完成,又称 Fullfilled) 或 Rejected(已失败)
只有异步操作的结果才能知道当前是哪种状态,任何其他操作都无法改变这个状态

  • 一旦状态改变就不会再变

Promise状态改变只有两种可能: 【Pending => Resolved】 【Pending => Rejected】
只要其中之一发生状态就会凝固,不会再变

3)优点
  • 将异步操作以同步操作的流程表达出来,避免层层嵌套的回调
4)缺点
  • Promise一旦建立就会立即执行,无法中途取消
  • 如果不设置回调函数,Promise 内部抛出的错误不会反应到外部
  • 当处于Pending状态时,无法得知目前进展到哪一个状态(刚开始还是即将完成)

2. 应用

1)使用方式

step1 => 实例化Promise对象,通过 resolve 和 reject 两个函数将异步操作的结果传递出去
    resolve: 在异步操作成功时,将异步操作的结果作为参数传递出去【状态从 Pending 变成 Resolved】
    reject: 在异步操作失败时,将异步操作报出的错误作为参数传递出去【状态从 Pending 变成 Rejected】

var promise = new Promise((resolve, reject) => {
    // ... some code
    
    if(/* 异步操作成功 */){
        resolve(value);
    } else {
        reject(error);
    }
});

step2 => 通过 then 指定 Resolved 和 Rejected 状态的回调函数
    第一个回调函数是对象的状态变为 Resolved 时调用
    第二个回调函数是对象的状态变为 Rejected 时调用

promise.then(value => {
    // success
},error => {
    // failure
})
2)示例

axios 与 Promise 异步调用接口获取数据

import Axios from 'axios';
import Qs from 'qs';

let axios = Axios.create({
    baseURL: '', // 基础url前缀
    headers: {'Content-Type': "multipart/form-data"}
});

function fetchApi (url) {
   return new Promise((resolve, reject) => {
    let params = {
        // ... some coed
    } 
    
    // Qs.stringify - 防止post请求参数无法请求到后台
    axios.post(url, Qs.stringify(param))
        .then(response => {
            resolve(response.data);
        }, error => {
            reject(error);
        })
        .catch(err => {
            reject(error)
        })
   });
}

3. 常用方法

1) Promise.prototype.then()
  • 作用:为Promise 实例添加状态改变时的回调函数
  • 参数:第一个参数为 resolved 状态的回调函数,第二个参数为 rejected 状态的回调函数(非必传)
  • 返回:一个新的 Promise 实例(不是原来的那个 Promise 实例),因此可以采用 链式操作
runAsync1()
.then(data => {
    console.log(data);
    return runAsync2();
})
.then(data => {
    console.log(data);
    return runAsync3();
})
.then(
    data => console.log(data),
    err => console.log(err)
);

上面代码中,异步任务1执行成功后,再执行异步任务2,异步任务2成功后,再执行异步任务3
runAsync() 返回的是 Promise 对象,通过 then() 函数进行相应操作。如此情况,称作是“链式操作”

2) Promise.prototype.catch()

用于指定发生错误时的回调函数

getJSON('/post.json')
.then(post => {
    // 状态变为 resolved 时调用
    // ... some code
})
.catch(error => {
    // 状态变为 rejected 时调用
    // then方法指定的回调函数,如果运行中抛出错误,也会掉用
    console.log('发生错误', error);
})
3) Promise.prototype.finally()

用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

promise
.then(result => {···}) // 状态变为 resolved 时调用
.catch(error => {···}) // 状态变为 rejected 时调用
.finally(() => {···}); // 始终都会执行

相关文章

  • Promise详解

    Promise详解词:Promise,resolve,reject,Prepending,Resolve,Reje...

  • Promise详解

    Promise 是一种处理异步的思路。Promise 也是一个类。当我们说一个 promise 的时候,一般指一个...

  • 详解Promise

    1.含义:是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大。 2.特点 (1)对象的...

  • promise详解

    Promise 用法api 1.基本用法 2.简便写法 Promise.all([]) Promise.race...

  • Promise详解

    知识梳理 promise:    ES6原生提供了Promise对象    它是异步编程的一种解决方案    就像...

  • Promise详解

    Promise对象 1.Promise是什么 1)含义 英译: 承诺 是一个对象 用来传递异步信息 代表未来才会知...

  • axios 关于请求前后的改变状态或操作

    第一种 实现 promise的finally方法,在finally中改变,可以写的参考promise详解封装一下a...

  • JS - Promise 和 async awiat

    1、什么是promise promise是一个对象,是用来处理异步操作的 2、promse有什么用: 详解地址:h...

  • Promise总结

    前言 看完阮一峰大神的Promise详解之后,自己总结一下promise的用法,毕竟看的东西是别人的,自己写的总结...

  • 详解Promise/Promise/A+ 规范

    2019-03-17-13:17于杭州当别人问起来什么是Promise/A+规范,可能会觉得有点懵,你可能用过Pr...

网友评论

      本文标题:Promise详解

      本文链接:https://www.haomeiwen.com/subject/huwzcqtx.html