Promise Js: 等待 Promise 完成

13

我正在使用Bluebird处理Node.Js中的Promise,我想知道如何使函数在Promise完成(fulfilled)时返回。我想要的行为是:

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

然而,由于 Promise 在执行时还未完成,上述实现将不会返回任何内容。有什么最好的解决方法呢?

getItem 的目的是修改 functionReturningPromise 返回的任何内容,并返回它。


1
你不能这样做。如果你的操作是异步的,那么该操作的结果永远无法同步返回。只需返回你的 Promise,并让调用者在 Promise 上使用 .then() 来获取结果。这就是在 Node.js 中进行异步开发的方式。 - jfriend00
2个回答

16

你不能这样做,var value = someAsyncFunction()不可能实现(至少在我们有生成器之前)。Promises是具有传染性的,一旦你在函数中使用了Promise,在它的调用者、调用者的调用者等到主程序都必须使用then。因此,在调用getItem的函数中,你必须改变这个。

item = getItem();
do something with item

转变成这样

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

而且getItem也应该返回一个 Promise。

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

理论上它也可以是回调函数,但我更喜欢始终返回Promise。


+1 但是...你不需要Promise.resolve(result)。只需返回result,因为你在then中。当使用promises时,请不要建议回调函数。 - Onur Yıldırım
1
@OnurYıldırım:没错,这里已经很晚了 ;) - georg
返回 Promise 做了我想要的事情。 - Ashwini Khare

-2
getItem的目的是修改functionReturningPromise返回的任何内容,然后将其返回。那么,我认为你可以简单地这样做:
functionReturningPromise.then(getItem);

在哪里

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

在这里,你只是将一个函数作为回调传递进去,你不能在 Promise 外部返回该值。 - richardpringle
@richardpringle 你说得对。不过,即使回答是错误的,我也不会删除它,让踩票来吧;我应该受到惩罚。 - Dimitris Karagiannis
这实际上很有帮助,因为那正是我正在做的事情。 - Aditya Kendre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接