• 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
    })
  • 相关阅读:
    Android中获取屏幕高度和宽度
    Android--第三方控件--okHttp
    Android中获取手机电量信息
    Android中获取并设置屏幕亮度
    ViewPager实现图片的轮播
    ScrollView嵌套使用ListView冲突的解决与分析
    Vue中的MVVM框架
    vue(一)
    RabbitMQ消费端ACK与重回队列机制,TTL,死信队列详解(十一)
    RabbitMQ消费端限流策略(十)
  • 原文地址:https://www.cnblogs.com/mengff/p/7448964.html
Copyright © 2020-2023  润新知