我對(duì)Promise警告信息的理解a promise was created in a handler but was not returned from it

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、拿著原來的promise,繼續(xù)then
4、都return一下

出現(xiàn)異常地方的截圖:


錯(cuò)誤1.png

錯(cuò)誤2.png

2591行,這里X為undefine,然后944行就進(jìn)入了if里面了,錯(cuò)誤警告信息就是在if里面。
如果拿掉catch,到了這一步會(huì)終止,不繼續(xù)往下執(zhí)行了


終止了.png

導(dǎo)致這個(gè)的警告原因:
我對(duì)上圖的猜想+下面展示的圖的理解:首先要知道Promise都是循環(huán)調(diào)用then(),由上一個(gè)then()調(diào)用下一個(gè)then(),這是一個(gè)鏈?zhǔn)揭?guī)則

runAsync1.then(){
   runAsync2(); //這里沒有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)的警告信息

別人的解讀.png

別人的截圖2.png

我對(duì)下圖的猜想+理解:他的道理跟上面的差不多,都必須要鏈?zhǔn)秸{(diào)用,那個(gè)人沒有retrun 一個(gè)Promise的對(duì)象回來,后續(xù)的then立即調(diào)用了
解釋.png

請(qǐng)勿打我臉,哈哈哈哈哈哈
參考網(wǎng)址:
http://taoofcode.net/promise-anti-patterns/ (別人的截圖.png的地址)
https://github.com/petkaantonov/bluebird/issues/508 (解釋.png的地址)

感覺這篇博客還是沒寫好,后面有時(shí)間,我再重稿一次

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容