2016-08-05 91 views
0

因此,如果函數的調用者(服務的用戶)可以使用該函數,那麼如果他想對函數產生的信息做些什麼的話。如果他不在乎什麼時候完成,只要有時間完成,他就可以在沒有任何基礎設施的情況下調用該函數。函數是否可以返回一個promise,或者不是?

這項工作?我不想陷入這樣一種情況,即它會在我的測試中發揮作用,但在一些不常發生的模糊情況下,它會失敗。


嗯。我想我的意思是這個。如果我寫返回諾言常規,我不得不說:

return new Promise(function (resolve, reject) { ... }); 

如果我的來電者不說:

.then(function() { ... }, function() { ... }); 

會發生什麼?我會在某個時候調用resolve()或reject(),並且不會定義解析和拒絕。 Promise構造函數是否提供了一些默認(無所作爲)定義?

我想,如果我是一個瘋狂的人,我可以在我的調用函數說:

(resolve || function() {})(); 
+0

我沒跟着。你可以從函數返回任何你想要的東西,但是如果它*可能需要異步操作,你應該總是返回一個承諾。如果你問你是否需要**來使用函數的返回值,那麼答案是否定的。但是,您無法保證操作完成。 –

+0

嗯?調用者總是可以決定它是否對返回值做了一些事情。但被調用者不知道這一點。 –

+0

我認爲問題在於是否可以執行承諾返回異步函數,並在不添加任何解析代碼的情況下執行它的工作。答案是肯定的。但請記住,除非您確定它已完成,否則您將無法可靠地測試異步函數的工作方式。 – danh

回答

1

返回一個承諾會做你想要它做的功能。

給出一個函數B():

如果用戶沒有B鏈(),則(),他們最終將得到答案時,它已經完成。他們應該處理這樣一個事實,即他們不知道價值何時填充。這是可以預料的。如果用戶做鏈B()。然後(),他們將有一個很好和簡單的方法來控制一旦返回值會發生什麼。

你不需要擔心奇怪的邊緣情況。返回承諾的函數是一個明確而直接的合同。

1

與Javascript中的所有函數一樣,調用者可以自由地忽略返回值。 JavaScript垃圾收集器將處理不再使用的對象或值。

因此,如果某個返回承諾的異步操作的調用者真的不在乎何時完成或者有錯誤,則調用者可以自由地忽略返回的承諾。沒有什麼不好的事情發生(除了你可能永遠不知道有錯誤的事實)。

你的問題似乎並沒有被同此涼的部分是你說:「如果他因爲它得到完成某個時候時,不得到執行在意,只要」。如果你忽略異步錯誤,那麼這可能不會在某個時候完成,你可能永遠不會知道這一點。在這種情況下,它可能做的更合適:

someAsyncFunc(...).catch(function(err) { 
    console.err(err); 
    // so something meaningful with the error here 
}); 
-1

除非特別需要包裝一箇舊的API,使用Promise構造是一個反模式。改爲使用Promise工廠,或者如果使用bluebird,請查看您是否可以在傳統功能上使用藍鳥的promisify

也似乎誤解了什麼參數傳遞到無極構造函數的參數是。它們不是回調,它們是解決諾言的功能。承諾本身會擔心通知任何回調,如果它們存在。另外,如果你的函數有時返回Promise,有時不會,你可能會崩潰任何代碼,假定它可以調用.then函數的返回值。不要這樣做。

如果你的計算可能是異步,總是返回Promise。如果您想要返回已經結算的值,請返回Promise.resolve(theValue)

+0

使用工廠而不是構造函數。點好了。我會研究這一點。 (我沒有使用藍鳥。)/看看你的句子「如果你的函數有時會返回一個承諾,有時不會。」我的功能總是返回一個承諾。我希望調用者不必擔心它會返回一個承諾,如果它沒有任何要求完成工作的同步。 – user2171796

+0

調用者可以說這兩個事情,他們都將工作:1. myPromiseReturningFunction(); console.log('啓動mPRF後'); 2. myPromiseReturningFunction()。然後(函數(){console.log('完成mPRF。');}); console.log('啓動mPRF後'); – user2171796

相關問題