• promise A


    下面是我的测试数据,不够好,推荐看一篇就够了,https://www.jianshu.com/p/c633a22f9e8c

    1.正常情况下

     1 var RSVP = require('rsvp');
     2 function A(){
     3     return new RSVP.Promise(function(resolve){
     4         resolve("A");
     5     })
     6 }
     7 
     8 function B(){
     9     return new RSVP.Promise(function(resolve){
    10         resolve("B");
    11     })
    12 }
    15 function C(){
    16     return new RSVP.Promise(function(resolve){
    17         resolve("aC");
    18     })
    19 }
    22 A().then(function(res1){
    23     console.log("result="+res1);
    24     if(res1=="A"){
    25         return B();
    26     }else{
    27         
    28     }
    29 }).then(function(res2){
    30     console.log("step2  result", res2);
    31     return C();
    32 }).then(function(res3){
    33     if(res3 =="aC"){
    34         console.log('comming in');
    35     }else{
    36         console.log("res3="+res3);
    37     }
    38 }).catch(function(err){
    39     cosnole.log("err",err);
    40 })
    41 
    42 //result=A
    43 //step2  result B
    44 //comming in

    分析:这是常规的Promise A的写法。现在把第24行改成if(res1=="a"),表示不会执行B();看看结果:

    result=A
    step2  result undefined  //如果不是一个promise A().继续执行。
    comming in

    得出结论:仍然往下执行30行和31行,只不过是res2为undefined.

    2.中途出现异常情况

    A().then(function(res1){
        console.log("result="+res1);
        if(res1=="A"){
            throw Error("err in A");
            // B().then(function(res){
            //     if(res == "B"){
            //         throw Error("err");
            //     }else{
            //         console.log(res);
            //     }
            // }).catch(function(err){
            //     console.log("err.message=",err.message);
            //     throw Error("yy"); 
            // });
        }else{
            return B();
        }
    }).then(function(res2){
        console.log("step2  result", res2);
        return C();
    }).then(function(res3){
        console.log("step3 result",res3);
    }).catch(function(err){
        console.log("err",err.message);
    });
    //result=A
    //err err in A
    //出现throw,下面不执行。

    3.顺序不正确的运行

    A().then(function(res1){
        console.log("result="+res1);
        if(res1=="A"){
            //B()与then(function(res2))并行运算,不过then(function(res2))无返回。如果这里不返回一个Promise,则下面的then语句继续执行。而且结果为undefined。
            B().then(function(res){
                if(res == "B"){
                    console.log("res="+res);
                    return B();
                }else{
                    console.log(res);
                }
            }).then(function(xx){
                console.log("xx="+xx);
            }).catch(function(err){
                console.log("err.message=",err.message);
                throw Error("yy"); 
            });
        }else{
            return B();
        }
    }).then(function(res2){
        console.log("step2  result", res2);
        return C();
    }).then(function(res3){
        console.log("step3 result",res3);
    }).catch(function(err){
        console.log("err",err.message);
    });
    /*
    result=A
    res=B
    step2  result undefined
    xx=B
    step3 result aC
    */

    继续看下面的例子:

    function A(){
        // return B();
        // console.log('K');
        // return new RSVP.Promise(function(resolve,reject){
        //     resolve(B());
        // });
        return new RSVP.Promise(function(resolve,reject){
            B().then(function(c){
                console.log("c="+c);
                if(c == 'b'){
                    return C();
                }else{
                    //k = undefined,resolve不返回promise,而resolve是函数。下面then继续执行。
                    resolve(1);   
                }
            }).then(function(k){
                console.log("k="+k);
                resolve(2);
            });
        });
    }
    
    function B(){
        return new RSVP.Promise(function(resolve){
            resolve("B");
        })
    }
    function C(){
        return new RSVP.Promise(function(resolve){
            resolve("aC");
        })
    }
    
    A().then(function(res1){
        console.log("res1=",res1);
    }).catch(function(err){
        console.log(err);
    })
    
    // c=B
    // res1= 1
    // k=undefined

    4.解决问题

    A().then(function(res1){
        console.log("result="+res1);
        if(res1=="A"){
            return new RSVP.Promise(function(resolve,reject){
                B().then(function(res){
                    if(res == "b"){
                        console.log("res="+res);
                        resolve("bc");
                    }else{
                        reject("err is here!");  //下面不能有then语句了。
                    }
                }).catch(function(err){
                    reject("err is that!");
                });
            });
        }else{
            return B();
        }
    }).then(function(res2){
        console.log("step2  result", res2);
        return C();
    }).then(function(res3){
        console.log("step3 result",res3);
    }).catch(function(err){
        console.log("err",err);
    });
    /*
    result=A
    err err is here!
    */
    同时顺序执行也正常。
    result=A
    res=b
    step2 result bc
    step3 result C

    5.在promise中Catch语句中throw没有resolve和reject语句的功能。也就说它不会把执行的结果回导到上一个promise的队列回调函数中。如:

    A().then(function(res1){
        if(res1=="A"){
            return new RSVP.Promise(function(resolve,reject){
                B().then(function(res){
                    if(res == "b"){
                        console.log("res="+res);
                        resolve("bc");
                    }else{
                        throw new Error("err is here!");
                    }
                }).catch(function(err){
                    console.log("err="+err);
                    //err=Error: err is here!
                    throw new Error(err);
                });
            });
        }else{
            return B();
        }
    }).then(function(res2){
        //下面的then可能会中断
        console.log("step2  result", res2);
        return C();
    }).then(function(res3){
        console.log("step3 result",res3);
    }).catch(function(err){
        console.log("errx",err);
    });
    /*
    err=Error: err is here!
    */

    6.一个函数中有多个promise执行的情况:

    var RSVP = require('rsvp');
    function A(){
        return new RSVP.Promise(function (resolve,reject) {
            // body...
            console.log("comming in here!");
            resolve(1);
        }).then(function(result){
            console.log('A',result);
            return new RSVP.Promise(function (resolve,reject) {
                // body...
                resolve(result*2);
            })
        });
    }
    A().then(function(result){
        console.log("this result is :"+result);
    });
    //comming in here!
    //A 1
    //this result is :2

    7.还有一种情况

    function AB(k){
        A().then(function(x){
            console.log(x);
            return B().then(function(y){
                console.log(y);
                return C();
            });
            //下面不会执行
            if(k=1){
                console.log('kkkkk');
            }
        }).then(function(z){
            //接C
            console.log(z);
        })
    }
    AB(1);

    这也是一种promise/A的模式,要记!

    ES6已经把Promise纳入标准,而且还提供all、race、resolve、reject和done、finally的API,例如:

    new Promise((resolve,reject) => { 
         console.log("hello world!");  //hello world!
         resolve({});
    });

     API:Promise.resolve()

    接受一个参数,返回一个promise,这个参数如果是个Promise,则原封不动返回,参数是个enable对象,也就是说这个对象实现了then方法,Promose.resolve也可以不用带任何参数,

    直接返回一个空Promise。

  • 相关阅读:
    Oracle条件分支查询
    Oracle分组函数实例
    使用JDK合成照片
    Oracle存储过程记录异常日志
    Emmet Cheat Sheet(Sublime编辑)
    JS中级
    JS中级
    架构师必须知道的架构设计原则
    JS中级
    JS中级
  • 原文地址:https://www.cnblogs.com/liuyinlei/p/6903467.html
Copyright © 2020-2023  润新知