概念

Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示.
简单说,就是处理异步请求的。
之所以叫做Promise,就是我承诺,如果成功则怎么处理,失败则怎么处理。

//语法
new Promise(
    /* executor */
    function(resolve, reject) {...}
);

executor

  • executor 是一个带有resolve 和reiect 两个参数的西数。
  • executor 函数在Promise构造函数执行时同步执行,被传递resolve和reject函数(executor 函数在Promise构造函数返回新建对象前被调用),
  • executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled即完成,或者在发生错误时将它的状态改为rejected即失败。
  • 如果在executor函数中抛出一个错误,那么该promise 状态为rejected。 executor函数的返回值被忽略
  • executor中,resolve或reiect只能执行其中一个函数

promise的状态

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

Promise.then(onFulfilled, onRejected)
参数是2个函数,根据Promise的状态来调用不同的函数,fulfilled走onFulfilled函数,rejected走onRejected函
数。
then的返回值是一个新的promise对象。调用任何一个参数后,其返回值会被新的promise对象来resolve,向后传


// 简单使用
var myPromise = new Promise ((resolve, reject) => {
    resolve('he11o'); //执行,置状态为fulfi1led
    console. log('~~~~~~~~~~');
    reject('world "); //永远执行不到
});
 
myPromise.then(
    /*如果成功则显示结果*/
    (value) => console.log(1, myPromise, value),
    /*如果失败则显示原因*/
    (reason) => console.log(2, myPromise, reason)
);

catch(onRejected)

为当前Promise对象添加一个拒绝回调,返回一个新的Promise对象。onRejected函数调用其返回值会被新的Promise对象用来resolve。

var myPromise = new Promise((resolve, reject) => {
    // resolve('he11o');  // 执行,置状态为fulfi1led
    console.log('~~~~~~~~~~");
    reject('world'); // 可以执行了
});

console.log(myPromise);

// 链式处理
myPromise.then(
    (value) => console.log(1, myPromise, value),
    (reason) => console.log(2, myPromise, reason)
).then(
    function (v){
        console.log(2.5, v);
        return Promise.reject(v + "***") //
    ).catch(reason => {
        console.log(3, reason);
        return Promise.resolve(reason);
})
### 异步实例
```javascript

function runAsync(){
    return new Promise (function(resolve, reject){
        setTimeout (function(){
           console.log('do sth...');
           resolve('ok..."):
        }, 3000);
    });
}

//调用
runAsync().then(value => {
    console.log(value) ;
    return Promise.reject(value + '*');
}).catch(reason => {
    console.log(reason);
    return Promise.resolve(reason + '*');
}).then (value => {
    console.log(value);
    console.log('END');
});
console.log('~~~~~ FIN ~~~~~")