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。

原文地址:https://www.cnblogs.com/liuyinlei/p/6903467.html