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

  • 相关阅读:
    Entity Framework 6.1
    Entity Framework Code First学习系列
    oracle 监控执行的sql语句
    修改Oracle XE Listener 占用的1521、8080端口
    Oracle中使用Entity Framework 6.x Code-First
    ASP.Net MVC 数据处理
    权限系统
    订单处理减库存的设计
    表达式树,它与表达式、委托
    监听服务管理(转)
  • 原文地址:https://www.cnblogs.com/liumingwang/p/10207971.html
Copyright © 2011-2022 走看看