• ES6-Promise


    Promise

    基本用法

    创建Promise实例

    • demo
    var promise = new Promise(function(resolve, reject){
        // ... some code
        if(/* 异步操作成功 */){
            resolve(value);
        }else{
            reject(error);
        }
    });
    

    实例方法:then()

    • 第一个参数是成功回调,状态为resolved时被调用
    • 第二个参数是失败回调,状态为rejceted时被调用
    • 尽量不要使用第二个参数处理失败回调,而是使用catch()
    promise.then(function(data){
        console.log(data);
        return data;
    }, function(error){
        console.log(error);
    }).then(function(data){
        console.log(data);
    });
    

    实例方法:catch()

    • .then(function(null, errorCallback){})的别名,只处理异常情况
    • 执行then方法时的报错,也会被catch捕获
    promise.then(function(data){
        aaaaa
        console.log(data);
    }).catch(function(error){
        console.log(error); // aaaaa is not defined
    })
    

    静态方法:all()

    • 参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例
    var ajaxs = [1, 2, 3, 4, 5].map(function(item){
        return $http.get('/get/' + id);
    })
    Promise.all(ajaxs).then(function(datas){ // 数组
        
    }).catch(function(error){ // 第一个失败的异步方法返回值
        
    })
    

    静态方法:trace()

    • 用法同all()
    • 不同的是,不是多个Promise方法全部返回之后触发成功或失败,而是返回结果比较快的那个Promise方法决定成功或失败
    var demo = Promise.race([
        fetch('xxx.json'),
        new Promise(function(resolve, reject){
            setTimeout(() => reject(new Error('request timeout')), 5000)
        })
    ]);
    demo.then(function(data){
        console.log(data); // fetch如果在5000ms以内返回时执行
    }).catch(function(error){
        console.log(error); // fetch如果在5000ms以内未返回时执行
    })
    

    静态方法:resolve()

    • 将现有对象转换为Promise对象

    静态方法:reject()

    • 将现有对象转换为Promise对象

    实例

    一个通过Promise实现的ajax请求

    • 仅做Promise用法说明,未进行验证兼容性验证
    const $http = (function(){
        const core = {
            ajax(method, url, args){
                const promise = new Promise(function(resolve, reject){
                    const client = new XMLHttpRequest();
                    let uri = url;
                    let params = '';
                    let argCount = 0;
                    for(let key in args){
                        if(args.hasOwnProperty(key)){
                            if(argCount++){
                                params += '&';
                            }
                            params += encodeURIComponent(key) + '=' + encodeURIComponent(args[key]);
                        }
                    }
                    if(method === 'GET'){
                        uri += '?' + params;
                    }
                    client.open(method, uri, true);
                    client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                    client.send(method === 'GET' ? null : params);
                    client.onload = function(){
                        if(this.status >= 200 && this.status < 300){
                            resolve(this.response);
                        }else{
                            reject(this.statusText);
                        }
                    };
                    client.onerror = function(){
                        reject(this.statusText);
                    };
                });
                return promise;
            }
        };
        return {
            get(url, args){
                return core.ajax('GET', url, args);
            },
            post(url, args){
                return core.ajax('POST', url, args);
            },
            ajax(method, url, args){
                return core.ajax(method, url, args);
            }
        };
    })();
    
    // 使用
    $http.post('js/content.js', {
        'a': 1,
        'b': 2
    }).then(function(data){
        console.log(data);
    }).catch(function(error){
        console.log(error);
    });
    

    与Generator结合

  • 相关阅读:
    js压缩、混淆和加密 Alan
    与、或、异或运算 Alan
    Hello world Alan
    abstract class和interface有什么区别?
    接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?
    启动一个线程是用run()还是start()?
    数组有没有length()这个方法? String有没有length()这个方法?
    swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
    当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
    简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
  • 原文地址:https://www.cnblogs.com/ddfe/p/5609730.html
Copyright © 2020-2023  润新知