2016-03-03 79 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你是对的。尽管如此,即使它是错误的,也不会删除答案,而是让降薪来临;我配得上他们。 –