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()
的库而不返回一个可对象的对象。
答案 0 :(得分:1)
我不知道这里的“反对模式”通常是什么。您可return
或await
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术语中都是map
和flatMap
。