您好,登錄后才能下訂單哦!
這篇文章主要介紹“JavaScript中Promise遇到的問題怎么解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“JavaScript中Promise遇到的問題怎么解決”文章能幫助大家解決問題。
國內比較流行的看法:
阮一峰: Promise 對象
Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。它由社區最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise
對象。
return
代替 resolve
不可以,無法實現鏈式調用,且不符合規范。
示例:
const testReturn = (a:boolean):Promise<any> =>{ return new Promise((resolve,reject)=>{ if(a){ return 'this is return'; resolve('true'); console.log('this will not be exec'); throw new Error('error'); }else{ reject('false'); } }) }
執行結果:
~ ts-node return.ts Promise { <pending> }
無法改變狀態
無法鏈式調用
答案: 使用reject
而不是throw
const testReturn = (a:boolean):Promise<any> =>{ return new Promise((resolve,reject)=>{ if(a){ resolve('true'); console.log('this will be exec'); throw new Error('error'); }else{ reject('false'); } }) } console.log(testReturn(true));
執行結果
~/chen/FE/winSep/codes/javascript/es6promise/src ts-node return.ts this will be exec Promise { 'true' }
解釋:
Promise的構造函數,以及被 then
調用執行的函數基本上都可以認為是在 try…catch
代碼塊中執行的,所以在這些代碼中即使使用 throw
,程序本身也不會因為異常而終止。Promise的狀態也不會發生改變。
如果在Promise中使用 throw
語句的話,會被 try...catch
住,最終promise對象也變為Rejected狀態。
var promise = new Promise(function(resolve, reject){ throw new Error("message"); }); promise.catch(function(error){ console.error(error);// => "message" });
運行
Error: message
代碼像這樣其實運行時倒也不會有什么問題,但是如果想把 promise
設置為Rejected狀態的話,使用 reject
方法則更顯得合理。
所以上面的代碼可以改寫為下面這樣。
var promise = new Promise(function(resolve, reject){ reject(new Error("message")); }); promise.catch(function(error){ console.error(error);// => "message" })
總結:如果在Promise中使用 throw
語句的話,會被 try...catch
住,最終promise對象也變為Rejected狀態。
當沒有Error
的時候, resolve
會將Promise.then
放在微任務隊列中,當所有的宏任務執行結束的時候,執行微任務隊列。
const testReturn = (a:boolean):Promise<any> =>{ return new Promise((resolve,reject)=>{ if(a){ resolve('exec true'); console.log('this will be exec'); // throw new Error('error'); }else{ reject('false'); } }) } testReturn(true).then(str=>{ console.log(str); })
執行結果
this will be exec exec true
當有Error
的時候,Error
后面的代碼不會被執行,但是Promise
的結果依舊是fulfilled
const testReturn = (a:boolean):Promise<any> =>{ return new Promise((resolve,reject)=>{ if(a){ resolve('exec true'); console.log('this will be exec'); throw new Error('error'); console.log('this will not be exec') }else{ reject('false'); } }) } testReturn(true).then(str=>{ console.log(str); // console.log(testReturn) }).catch(err=>{ console.log('err: ',err); })
執行結果
this will be exec
exec true
看例子:
const testReturn = (a:boolean):Promise<any> =>{ return new Promise((resolve,reject)=>{ setTimeout(()=>{ if(a){ resolve('exec true'); console.log('this will be second exec'); }else{ reject('false'); } }) console.log('this will first be execd'); }) } testReturn(true).then(str=>{ console.log(str); // console.log(testReturn) }).catch(err=>{ console.log('err: ',err); })
結果
this will first be execd this will be second exec exec true
解釋:
時間 | 宏任務隊列 | 微任務隊列 |
---|---|---|
1 | console.log('this will first be execd') | |
2 | setTimeout | |
3 | resolve('exec true'); //延遲:因為宏任務沒有執行完 | |
4 | console.log('this will be second exec'); |
最終執行順序:
1->2->4(宏任務結束)->3(微任務結束)
一句話總結: await
等的就是一個Promise
。如果等的不是Promise
,那加了await
和不加沒區別
將常規的回調轉變為Promise
的方法
function util(args,callback){ if(err){ return callback(err); }else{ return callback(); } } //調用 util(args,(err)=>{ if(err){ }else{ } }) //Promisify function utilPromise(args){ return new Promise((resolve,reject)=>{ if(err){ reject(err) }else{ resolve(); } }) } //調用 utilPromise.then().catch()
將Promise
轉換為async/await
的方法
async init(){ try{ await utilPromise();//resolve狀態 }catch(e){ throw new Error(e); //reject狀態 } }
關于“JavaScript中Promise遇到的問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。