Promise基本使用及方法介绍
Promise是异步编程的一种解决方案,用于一个异步操作的最终完成(或失败)及其结果值的表示,比传统的回调函数方案更加合理。
描述
1.Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。
2.一个 Promise有以下几种状态:(1) pending: 意味着操作正在进行。(2) fulfilled: 意味着操作成功。(3) rejected: 意味着操作失败。
3.pending 状态的 Promise 对象可能触发fulfilled 状态并传递一个值给相应的状态处理方法,也可能触发失败状态(rejected)并传递失败信息。当其中任一种情况出现时,Promise 对象的then 方法绑定的处理方法(handlers )就会被调用(then方法包含两个参数:onfulfilledonrejected(可选参数),它们都是 Function 类型。
语法
var promise = new Promise((resolve, reject) => {/* executor函数 */
    // ... some code
    if (/* 异步操作成功 */){
        resolve(value);
    } else {
        reject(error);
    }
});
promise.then((value) => {
    //success
}, (error) => {
    //failure
})
1.参数executor 函数在Promise构造函数执行时同步执行,被传递 resolvereject 函数(executor函数在Promise构造函数返回新建对象前被调用)。executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled(完成),或者将promise的状态改为rejected(失败)。如果在executor函数中抛出一个错误,那么该promise 状态为rejectedexecutor函数的返回值被忽略。
2.简单使用
function timeout(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms, 'done');
    });
}
timeout(2000).then((value) => {
    console.log(value); //done
});
细节
1.Promise对象在创建后立即执行,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行。
let promise = new Promise((resolve, reject) => {
    console.log('Promise1');
    resolve();
    console.log('Promise2')
});
promise.then(() => {
    console.log('resolved.');
});
console.log('Hi!');
// Promise1
// Promise2
// Hi!
// resolved
2.如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例,表示抛出的错误;resolve函数的参数除了正常的
值以外,还可能是另一个Promise 实例。
var p1 = new Promise((resolve, reject) => {
    setTimeout(() => reject(new Error('fail')), 3000)
})
var p2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve(p1), 1000)
})
p2
    .then(result => console.log(result))
    .catch(error => console.log(error))// Error: fail 
如果p2resolve方法将p1作为参数,p1的状态决定了p2的状态。如果p1的状态是pending,那么p2的回调函数就会等待p1的状态改变;如果p1的状态已经是resolved或者rejected,那么p2的回调函数将会立刻执行。由于p2返回的是另一个 Promise,导致p2自己的状态无效了,由p1的状态决定p2的状态。注意:resolve函数传递不同参数生成Promise对象的不同情况可以参考solve的用法。reject函数传递不同参数生成Promise对象的不同情况可以参考ject的用法。
var p1 = solve(value);
// 等价于
var p1 = new Promise(resolve => resolve(value));
var p2 = ject('err');
// 等同于
var p2 = new Promise((resolve, reject) => reject('err'));
原型方法
Promise.prototype.then(onFulfilled, onRejected)
1.语法p.then(onFulfilled, onRejected);p.then((value) => {// fulfillment}, (reason) => {// rejection});
2.含义为 Promise实例添加状态改变时的回调函数。then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数。
3.链式操作then方法返回的是一个新的promise,因此可以采用链式写法,即then方法后面再调用另一个then方法。
new Promise(resolve => {
    resolve(1);
})
    .then(result => console.log(result)) //1
    .then(result => {
        console.log(result);              //undefined
        return 2;
    })
    .then(result => {
        console.log(result);            //2
        throw new Error("err");
    })
    .then((result) =>{
        console.log(result);           
    }, (err)=>{
        console.log(err);                //Error: err
        return 3;
    })
    .then((result) => {
        console.log(result);            //3
    })
注意:①不管是then方法的onfulfilled函数参数执行还是onrejected(可选参数)函数参数执行,then方法返回的都是一个新的Promise对象,都可以继续采用链式写法调用另一个then方法。②Promise.prototype.catch()方法返回的也是一个Promise对象。then方法和catch方法可以链式操作。
4.返回值then方法返回一个Promise,而它的行为与resolved是什么状态then中的被调用的回调函数(onfulfilled函数/onrejected函数)的返回值有关。(1) 如果then中的回调函数返回一个值,那么then返回的P
romise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。