Promise详解

2018-12-07  本文已影响0人  fayeLiao

Promise对象

1.Promise是什么

1)含义
2)特点

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

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

3)优点
4)缺点

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()
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(() => {···}); // 始终都会执行
上一篇下一篇

猜你喜欢

热点阅读