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