2016-03-03 103 views
6

我正在與Bluebird承諾Node.Js,並想知道如何才能使一個函數返回時承諾履行(完成)。我想要的行爲是:Promise Js:等待承諾完成

function getItem(){ 
    functionReturningPromise.then(function(result){ 
    //do some operation on result 
    return result; 
    }); 
} 

但是,上述實現不會返回任何內容,因爲承諾在執行時沒有完成。什麼是最好的解決方法呢?

的getItem的目的是修改什麼functionReturningPromise回報,然後返回它

+1

你不能。如果您的操作是異步的,那麼該操作的結果無法同步返回。簡單地返回你的承諾,讓調用者使用'.then()'來承諾結果。這就是異步開發在node.js中的工作方式。 – jfriend00

回答

10

您不能,var value = someAsyncFunction()是不可能的(直到我們有發生器,至少)。承諾是病毒性的,一旦你在一個函數中使用Promise,它的調用者必須使用then以及調用者的調用者等,直到你的主程序。因此,在調用getItem的功能,你必須改變這種

item = getItem(); 
do something with item 

這個

getItem().then(function(item) { 
    do something with item 
}) 

getItem應該返回一個承諾,以及

function getItem(){ 
    return functionReturningPromise().then(function(result){ 
    //do some operation on result 
    return result; 
    }); 
} 

(理論上它也可以是一個回調,但我更願意總是返回承諾)。

+0

+1但是......你並不需要'Promise.resolve(result)'。只需返回'result',因爲你在'then'中。並且請不要在使用promise時建議回調。 –

+1

@OnurYıldırım:對,這裏很晚;) – georg

+0

返回承諾做我正在尋找。 –

-2

的getItem的目的是修改什麼functionReturningPromise回報,然後返回它

然後,我想你可以簡單地做

functionReturningPromise.then(getItem); 

其中

function getItem(valueFromPromiseResolution){ 
    //do some operation on valueFromPromiseResolution 
    return whatever; 
} 
+0

在這裏,你只是將一個函數作爲回調函數傳遞,你不能在promise之外返回該值。 – richardpringle

+0

@richardpringle你是對的。儘管如此,即使它是錯誤的,也不會刪除答案,而是讓降薪來臨;我配得上他們。 –