zoukankan      html  css  js  c++  java
  • Promise的用简要使用方式

    Promise用法

    在项目中用到异步请求ajax,想到用promise来解决,之前用过但是已经很久了,还是忘了一些,重新熟悉了一下整理一份简要文档。

    Promise,就是一个对象,用来传递异步操作的消息

    Promise 对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)。

    如果异步操作成功,则用 resolve 方法将 Promise 对象的状态,从「未完成」变为「成功」(即从 pending 变为 resolved);

    如果异步操作失败,则用 reject 方法将 Promise 对象的状态,从「未完成」变为「失败」(即从 pending 变为 rejected)。

    var promise = new Promise(function(resolve, reject) {
    if (/* 异步操作成功 */){
    resolve(value);
    } else {
    reject(error);
    }
    });
    
    promise.then(function(value) {
    // success
    }, function(value) {
    // failure
    });
    
    

    可以简要看看promise的源码

    var Promise = function() {
        this.doneList = [];
        this.failList = [];
        this.state = 'pending';
    };
    
    Promise.prototype = {//几种常用方法
        constructor: 'Promise',
        resolve: function() {
            this.state = 'resolved';
            var list = this.doneList;
            for(var i = 0, len = list.length; i < len; i++) {
                list[0].call(this);
                list.shift();
            }
        },
        reject: function() {
            this.state = 'rejected';
            var list = this.failList;
            for(var i = 0, len = list.length; i < len; i++){
                list[0].call(this);
                list.shift();
            }
        },
        done: function(func) {
            if(typeof func === 'function') {
                this.doneList.push(func);
            }
            return this;
        },
        fail: function(func) {
            if(typeof func === 'function') {
                this.failList.push(func);
            }
            return this;
        },
        then: function(doneFn, failFn) {
            this.done(doneFn).fail(failFn);
            return this;
        },
        always: function(fn) {
            this.done(fn).fail(fn);
            return this;
        }
    };
    
    function when() {
        var p = new Promise();
        var success = true;
        var len = arguments.length;
        for(var i = 0; i < len; i++) {
            if(!(arguments[i] instanceof Promise)) {
                return false;
            }
            else {
                arguments[i].always(function() {
                    if(this.state != 'resolved'){
                        success = false;
                    }
                    len--;
                    if(len == 0) {
                        success ? p.resolve() : p.reject();
                    }
                });
            }
        }
        return p;
    
    }
    

    业务中的代码实现方式如下:在两次异步请求成功之后,再调用then的方法

    return (dispatch, getState)=> {
        let getDataFunc = function(data) {
            return new Promise(function(resolve, reject){
                if(!data) {
                    return resolve(null);
                }
                return requestJsonp({
                  url: '',
                  data: data,
                }, json=>{
                    resolve(json);
                }, err=>{
                    resolve(null);
                });
            });
        };
    
        return Promise.all([getDataFunc(data), getDataFunc(compareData)]).then((json)=>{
            if(!json[0] && !json[1]) {
                dispatch({
                    type: DATA_ERR
                });
            } else {
                dispatch({
                    type: REFRESH_GRAPH,
                    data: json
                });
            }
        });
    };
    
    
     
    现今流行的各大js库,几乎都不同程度的实现了Promise,如dojo,jQuery、Zepto等,它们暴露出来的大都是Deferred对象,以jQuery(Zepto类似)为例:方法更加简洁方便
    function getImg(url) {  
        var def = $.Deferred();  
        var img = new Image();  
    
        img.onload = function() {  
            def.resolve(this);  
        };  
    
        img.onerror = function(err) {  
            def.reject(err);  
        };  
    
        img.src = url;  
    
        return def.promise();  
    };  
    
    

    推荐一部书 promise迷你书,很薄的一本, 

     
  • 相关阅读:
    第十三周助教小结
    记事本
    第十二周助教小结
    与周老师会谈之后的感想
    第十一周总结
    第十周助教总结
    听周筠老师一席话,受益匪浅
    2020软件工程作业04
    2020软件工程作业02
    2020软件工程作业01
  • 原文地址:https://www.cnblogs.com/yinsu12311/p/5806713.html
Copyright © 2011-2022 走看看