摘要:從開始對的錯(cuò)誤使用會(huì)有以下三種,提醒你正在不正確使用,下面對這三種進(jìn)行解釋,并說明如何避免。因?yàn)闃?biāo)準(zhǔn)規(guī)定對待錯(cuò)誤使用時(shí)不予理睬。一個(gè)錯(cuò)誤是一個(gè)繼承于的對象。例如因?yàn)樵诘谝粋€(gè)里面,沒有作為結(jié)果,導(dǎo)致第二個(gè)認(rèn)為并立即執(zhí)行因?yàn)闆]有聲明默認(rèn)返回。
bluebird從3.x開始對promise的錯(cuò)誤使用會(huì)有以下三種Warning,提醒你正在不正確使用bluebird,下面對這三種warning進(jìn)行解釋,并說明如何避免。
Warning: .then() only accepts functions
Warning: a promise was rejected with a non-error
Warning: a promise was created in a handler but none were returned from it
Warning: .then() only accepts functions如果你看到這樣的提醒,說明你的代碼運(yùn)行結(jié)果不符合你的預(yù)期。最主要原因是傳個(gè).then()的參數(shù)是一個(gè)函數(shù)的執(zhí)行結(jié)果,而不是函數(shù)本身。
function processImage(image) { // Code that processes image } getImage().then(processImage());
上面的方法就是調(diào)用processImage()然后立刻將返回結(jié)果傳給.then().這里傳給.then()的參數(shù)就是undefined。
為解決這個(gè)問題,只要給.then()傳函數(shù)就可以了,就像這樣:
getImage().then(processImage)
Warning: a promise was rejected with a non-error如果你有疑問為什么這里不直接簡單粗暴地拋出TypeError,而是一個(gè)warning。因?yàn)镻romises/A+標(biāo)準(zhǔn)規(guī)定對待錯(cuò)誤使用時(shí)不予理睬。
由于JavaScript的歷史錯(cuò)誤,throw可以拋出任何類型的值。Promises/A+選擇繼續(xù)沿用這個(gè)錯(cuò)誤,所以promise是可以拋出一個(gè)非Error類型的值。
一個(gè)錯(cuò)誤是一個(gè)繼承于Error的對象。它至少需要有.stack和.message屬性。因?yàn)殄e(cuò)誤通常會(huì)被根據(jù)它的不同來源而被分成不同等級(jí),所以一個(gè)錯(cuò)誤需要包含足夠的信息,以讓高級(jí)別的handler擁有足夠的信息來生成一份有用的高級(jí)的錯(cuò)誤報(bào)告。
因?yàn)樗械膶ο蠖贾С謸碛袑傩?,你可能還會(huì)有疑問說,為什么一定要是一個(gè)Error對象而不能是一個(gè)普通的對象。一個(gè)錯(cuò)誤對象除了要有這些屬性,還有一個(gè)同樣重要的特性就是自動(dòng)采集stack trace。有了stack trace你才能容易的找到錯(cuò)誤的來源。
你最好處理下這些warning,因?yàn)橐粋€(gè)被拒絕的promise返回一個(gè)非Error,會(huì)導(dǎo)致調(diào)試非常艱難并且高成本。另外如果你拒絕一個(gè)promise只是使用最簡陋的調(diào)用reject(),這樣你就沒辦法處理錯(cuò)誤了,而且你只能告訴用戶“有地方出錯(cuò)了”。
Warning: a promise was created in a handler but none were returned from it這通常說明你只是單單地忘記了聲明return,但卻導(dǎo)致了該promise丟失,從而無法關(guān)聯(lián)到promise鏈中。
例如:
getUser().then(function(user) { getUserData(user); }).then(function(userData) { // userData is undefined });
因?yàn)樵诘谝粋€(gè)then里面,getUserData(user)沒有作為結(jié)果return,導(dǎo)致第二個(gè)then認(rèn)為userData=undefined并立即執(zhí)行(因?yàn)闆]有聲明return默認(rèn)返回undefined)。
解決這個(gè)問題,你只需要return這個(gè)promise:
getUser().then(function(user) { return getUserData(user); }).then(function(userData) { // userData is the user"s data });
如果你知道你在做什么,并且不想看到warning,你只需要隨便返回點(diǎn)什么,比如null:
getUser().then(function(user) { // 后臺(tái)執(zhí)行,不在乎運(yùn)行結(jié)果 saveAnalytics(user); // 返回一個(gè)非`undefined`的值,表示我們并沒有忘記return return null; });
原文鏈接:http://bluebirdjs.com/docs/warning-explanations.html
推薦閱讀:Bluebird promise 設(shè)置
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86270.html
摘要:可設(shè)置長堆棧跟蹤警告監(jiān)控和取消。注意雖然這里默認(rèn)值都是,但是在開發(fā)環(huán)境下自動(dòng)會(huì)開啟堆棧跟蹤和警告。你可以對單獨(dú)設(shè)置檢查忘記聲明的警告開啟所有警告除了檢查是警告屬性中唯一一個(gè)可以單獨(dú)拆分設(shè)置的屬性。 Promise.config(Object { warnings: boolean=false, longStackTraces: boolean=false, ca...
摘要:有一個(gè)和相關(guān)的更大的問題。最后,請負(fù)有責(zé)任感并且使用安全的擴(kuò)展。深入理解五部曲異步問題深入理解五部曲轉(zhuǎn)換問題深入理解五部曲可靠性問題深入理解五部曲擴(kuò)展性問題深入理解五部曲樂高問題最后,安利下我的個(gè)人博客,歡迎訪問 原文地址:http://blog.getify.com/promis... 現(xiàn)在,我希望你已經(jīng)看過深入理解Promise的前三篇文章了。并且假設(shè)你已經(jīng)完全理解Promises...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。寫一個(gè)符合規(guī)范并可配合使用的寫一個(gè)符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個(gè)需求:在系統(tǒng)初始化時(shí)通過http獲取一個(gè)第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個(gè)接口,可通過...
摘要:文章來自原文歡迎來到給開發(fā)者的源碼系列的第二部分。是在內(nèi)部代表任意一個(gè)變量的定義。這種情況下函數(shù)會(huì)拋出警告,而此函數(shù)馬上返回會(huì)返回給的用戶層代碼。原因是,是少數(shù)通過而不是擴(kuò)展定義的函數(shù)。下一部分下一部分會(huì)再次發(fā)表在。 文章來自:http://www.hoohack.me/2016/02/10/understanding-phps-internal-function-definitio...
摘要:不同的的實(shí)現(xiàn)需要可以相互調(diào)用,搞清楚了標(biāo)準(zhǔn)之后,開始動(dòng)手吧構(gòu)造函數(shù)產(chǎn)生一個(gè)對象有很多種方法,構(gòu)造函數(shù)是看起來最面向?qū)ο蟮囊环N,而且原生實(shí)現(xiàn)也是使用的構(gòu)造函數(shù),因此我也決定使用構(gòu)造函數(shù)的方法。 -- What i cant create, i dont understant 前言 實(shí)現(xiàn)Promise的目的是為了深入的理解Promies,以在項(xiàng)目中游刃有余的使用它。完整的代碼見gitHub...
閱讀 1842·2021-09-22 15:55
閱讀 3532·2021-09-07 10:26
閱讀 638·2019-08-30 15:54
閱讀 693·2019-08-29 16:34
閱讀 848·2019-08-26 14:04
閱讀 3271·2019-08-26 11:47
閱讀 2142·2019-08-26 11:33
閱讀 2300·2019-08-23 15:17