从承诺

时间:2016-04-01 02:06:04

标签: javascript mongoose promise async-await

find是一个函数,它返回一个解析为值的promise,但也包含promise对象本身的数据。实际用例是find()返回可在其他地方使用的dbQueryObject,而await find()使用databaseResults解析。例如:

function find () {
  var results = new Promise(/* resolves with databaseResults */)
  Object.assign(results, new dbQueryClass)
  return results
}

我可以使用函数包装find来提供这样的帮助,

function findPage (page) {
 return find().skip(page*20).limit(20)
}

并像findPage().select('_id')一样使用它来获取查询对象,或者使用await findPage().select('_id')来获取已解析的值(返回类似于find()的内容)。

但是,如果我用这样的承诺包裹find

async function findSomething() {
  var someArgs = await promise1()
  if (someArgs) return find(someArgs)
  return find()
}

如何在find()之外获取findSomething本身的值?我需要promise1来解决,但我需要find()才能解决。 find()是一个普通对象,可以根据您是否解决它而定,但解析findSomething()将自动解析返回的值。如何将其退回以使其无法解决?

我的约束是我无法修改提供find()的库而不返回一个可对象的对象。

2 个答案:

答案 0 :(得分:1)

我不知道这里的“反对模式”通常是什么。您可returnawait async函数中的任何承诺,特定或纯值,就像Promise.resolve他们一样,或从then回调中返回它们。这没有什么不寻常的,这就是它的完成方式。

如果你想明确回复一个承诺,而不是依赖于可靠的同化,你可以随时call .exec() on your mongoose query,它会给你一个“真正的”承诺。

答案 1 :(得分:1)

正如https://stackoverflow.com/a/22724984/704894所述,Promise<Promise<value>>是不可能的,因为当你在.then处理程序中返回一个Promise时,它会自动解析(解包)。

您必须使用Promise<Wrapper<Promise>>来绕过此限制。

函数式编程人员的旁注:.then在Haskell术语中都是mapflatMap