zoukankan      html  css  js  c++  java
  • Promise注意点

    一、

    Promise API  概述

    var p = new Promise( function(resolve,reject){
    // resolve(..) 用于决议 / 完成这个 promise
    // reject(..) 用于拒绝这个 promise
    } );
    

     reject(..)  就是拒绝这个 promise ;但 resolve(..)  既可能完成 promise ,也可能拒绝
    根据传入参数而定。如果传给 resolve(..)  的是一个非 Promise 、非 thenable  的立即值,这个 promise  就会用这个值完成。但是,如果传给 resolve(..)  的是一个真正的 Promise  或 thenable  值,这个值就会被递归展开,并且(要构造的) promise  将取用其最终决议值或状态

    二、

    var p = Promise.resolve(42);
    p.then(
        function fulfilled(msg) {
            //  数字没有 string 函数,所以会抛出错误
            console.log(msg.toLowerCase());
        },
        function rejected(err) {
            //  永远不会到达这里
        }
    );
    

     msg.toLowerCase()  合法地抛出一个错误,为什么我们的错误处理函数没有得到通知呢?正如前面解释过的,这是因为那个错误处理函数是为 promise p  准备的,而这个 promise  已经用值 42  填充了。 promise p  是不可变的,所以唯一可以被通知这个错误的 promise  是从 p.then(..)  返回的那一个,但我们在此例中没有捕捉。

    为了避免丢失被忽略和抛弃的 Promise  错误,一些开发者表示, Promise  链的一个最佳实践就是最后总以一个catch(..)  结束,比如:

    var p = Promise.resolve(42);
    p.then(
        function fulfilled(msg) {
            //  数字没有 string 函数,所以会抛出错误
            console.log(msg.toLowerCase());
        },
        function rejected(err) {
            //  永远不会到达这里
        }
    ).catch(function(err){
        console.log(err);
    })

     四、对方法进行Promise包装

    if(!Promise.wrap){
        Promise.wrap = function(fn){
           return function(){
            var args = [].slice.call(arguments);
            return new Promise(function(resolve,reject){
                fn.apply(null,args.concat(function(err,v){
                    if(err){
                        reject(err);
                    }else{
                        resolve(v);
                    }
                }))
            })
    
           } 
        }
    }
    
    
    
    function myajax(url,cb){
        $.ajax({
            url: url,
            type: 'GET',
        })
        .done(function(data) {
            cb(null,data)
        })
        .fail(function(err) {
            cb(err)
        })
        
    }
    
    var request = Promise.wrap(myajax);
    request('api/xxx')
    

     欢迎加入大前端交流群!群号:277942610

  • 相关阅读:
    HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)
    BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)
    分布式事务二阶提交DTS系统
    flume原理及代码实现
    Liferay JSP Tag Libraries介绍
    如何用maven tycho构建自己的Eclipse RCP应用
    如何合并两个git commit
    推荐一个好用的git图形化工具
    git gc干了啥
    如何把VS Code的Language Server Protocol整合到Eclipse中来
  • 原文地址:https://www.cnblogs.com/liumingwang/p/10207971.html
Copyright © 2011-2022 走看看