BUG內(nèi)容如下:
a promise was created in a handler but was not returned from it
代碼:
//異步請(qǐng)求1
function runAsync1() {
var p = new Promise(function (resolve, reject) {
//做一些異步操作
setTimeout(function () {
console.log('異步任務(wù)1執(zhí)行完成');
resolve('隨便什么數(shù)據(jù)1');
}, 1000);
});
return p;
}
//異步請(qǐng)求2
function runAsync2() {
var p = new Promise(function (resolve, reject) {
//做一些異步操作
setTimeout(function () {
console.log('異步任務(wù)2執(zhí)行完成');
resolve('隨便什么數(shù)據(jù)2');
}, 5000);
});
return p;
}
var promise = runAsync1()
.then(function(data){
console.log(data);
runAsync2();
return null;//1、解決成功,這個(gè)辦法不是很好
}).catch(function(e){
console.log(e);
});
辦法3:
promise.then(function() {
runAsync2();
});
辦法4:
runAsync1()
.then(function(data){
reurn runAsync2();
}).catch(function(e){
console.log(e);
});
二種解決辦法:
1、在錯(cuò)誤的行的下面添加 return null (這個(gè)辦法不是很好)
2上鞠、拿掉catch (這個(gè)辦法不是很好)
3斤彼、拿著原來(lái)的promise鸦泳,繼續(xù)then
4岔乔、都return一下
出現(xiàn)異常地方的截圖:
2591行船老,這里X為undefine,然后944行就進(jìn)入了if里面了圃酵,錯(cuò)誤警告信息就是在if里面柳畔。
如果拿掉catch,到了這一步會(huì)終止辜昵,不繼續(xù)往下執(zhí)行了
導(dǎo)致這個(gè)的警告原因:
我對(duì)上圖的猜想+下面展示的圖的理解:首先要知道Promise都是循環(huán)調(diào)用then()荸镊,由上一個(gè)then()調(diào)用下一個(gè)then(),這是一個(gè)鏈?zhǔn)揭?guī)則
runAsync1.then(){
runAsync2(); //這里沒(méi)有return 一個(gè)then堪置,所以為導(dǎo)致錯(cuò)誤
}.catch(function(e){
})
當(dāng)你 return runAsync2();就可以結(jié)束錯(cuò)誤了,如果你的runAsync1是最后一個(gè)then张惹,那么就可以不用繼續(xù)return了舀锨,也不會(huì)報(bào)錯(cuò)。
宛逗。核心思想就是要鏈?zhǔn)秸{(diào)用坎匿,破壞鏈?zhǔn)降亩疾徽_。下圖是在gitHub上看到有人出現(xiàn)我這樣的警告雷激,它是調(diào)用somehingComplicated()出現(xiàn)的警告信息
我對(duì)下圖的猜想+理解:他的道理跟上面的差不多替蔬,都必須要鏈?zhǔn)秸{(diào)用,那個(gè)人沒(méi)有retrun 一個(gè)Promise的對(duì)象回來(lái)屎暇,后續(xù)的then立即調(diào)用了
請(qǐng)勿打我臉承桥,哈哈哈哈哈哈
參考網(wǎng)址:
http://taoofcode.net/promise-anti-patterns/ (別人的截圖.png的地址)
https://github.com/petkaantonov/bluebird/issues/508 (解釋.png的地址)
感覺(jué)這篇博客還是沒(méi)寫(xiě)好,后面有時(shí)間根悼,我再重稿一次