Promise总结

1.生成Promise实例

var p = new Promise(function(resolve, reject) {
    // 异步处理
    // 处理结束后、判定什么情况下resolve这个Promise,什么情况下reject这个    Promise.
    // 通常resolve(value),将promise的状态转变成成功,value为之后要用的值
    // 通常reject(reason),将promise的状态转变为失败,reason为之后错误处理需要用的值
    if ( /* 异步操作成功的判定条件 */ ) {
        resolve(value);
    } else {
        reject(reason);
    }
});

resolve生成Promise实例

//Promise.resolve(someSyncValue).then(...)
function func(){
    return Promise.resolve.then(function(){
         ...
        return syncValue;
    }).then(...)
}

reject返回一个Promise失败实例

Promise.reject(new Error('some error'))

2. promise的特点

1.promise实例一旦生成,会立即执行
2.promise的状态状态变为resolved或rejected后,不可逆
3.promise的then中的函数有异步特性,不会立即执行

3.promise.then用法

1. then的函数中可以显式return一个值
2. return的是非Promise实例时,该值作为then返回的新的Promise实例的resolve的参数
由于js中函数没有显式return,则会默认返回undefined,因此若在then中执行一个同步
函数或语句,相当于返回undefined
3. return的是一个Promise实例时,相当于then返回的新实例就是这个实例
4. then函数中可以throw一个同步异常

4.promise中使用forEach

异步操作不能直接使用forEach,应该使用Promise.all,在then中返回一个Promise.all,例如:

db.allDocs(...).then(function(result){
    return Promise.all(result.rows.map(function(row){
        return db.remove(row.doc);
    }));
    }).then(function(res){
        //all docs have been removed
    })    

5.promise串行执行

1.直接then

promise1.then(function() {
    return promise2;
}).then(function() {
    return promise3;
})

2.promiseFactory加 forEach方法

function fSequecePromise(promiseArray) {
    var result = Promise.resolve();
    promiseArray.map(function(p) {
        return promiseFactory(p)
    }).forEach(function(pFactory) {
        result = result.then(pFactory)
    })
    return result;
}

function promiseFactory(promise) {
    return promise;
}

6.promise的应用

1.包装同步数据或定时器(例如localStorage、setTimeout、setInterval),提供统一接口

function $localStorage(key) {
    return Promise.resolve(localStorage.getItem(key));
}

2.包装延迟任务,如模态对话框的打开

$modal.open(...).then(function() {
    //ok button event
}, function() {
    //cancel button event
})

7. Promise包装ajax举例

function getJSON(url) {
    return new Promise(function(resolve, reject) {
        let xhr = new XMLHttpRequest(); //神奇的对象
        xhr.open('GET', url);
        xhr.onreadystatechange = handler;
        // 无论readyState值何时发生改变,XMLHttpRequest对象都会激发一个readystatechange事件,handler被调用,然后根据结果resolve,或者reject
        xhr.responseType = 'json';
        xhr.setRequestHeader('Accept', 'application/json');
        xhr.send();

        function handler() {
            if (this.readyState === this.DONE) {
                if (this.status === 200) {
                    resolve(this.response);
                    //successDo(this.response)
                } else {
                    reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
                    //faileDo(this.response)
                }
            }
        };
    });
}
// 使用promise
getJSON(url).then(function onFulfilled(value) {
    //successDo
}, function onRejected(reson) {
    //faileDo
})
原文地址:https://www.cnblogs.com/mengff/p/7448964.html