下面是我的测试数据,不够好,推荐看一篇就够了,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。