[英]Return a non-resolved promise from a promise
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()
}
我如何在findSomething
之外获取find()
本身的findSomething
? 我需要promise1
来解决,但是我需要find()
来解决。 find()
是一个普通对象,然后是一个thenable对象,具体取决于是否解析它,但是解析findSomething()
会自动解析返回的值。 如何退回无法解决的问题?
我的约束是我无法修改提供find()
的库以不返回可随后的对象。
我看不出这里通常是什么反模式。 您可以return
或await
async
函数中的任何promise,thenable或plain值,就像您可以Promise.resolve
它们或从then
回调中返回它们一样。 这没有什么不寻常的,这就是完成的方式。
如果您想明确地返回承诺,而不是依赖于可能的同化,则可以始终在猫鼬查询中调用.exec()
,它将为您带来“真正的”承诺。
如此处https://stackoverflow.com/a/22724984/704894所述 ,不可能有Promise<Promise<value>>
因为当您在.then
处理程序中返回Promise时,它会自动解析(展开)。
您必须使用Promise<Wrapper<Promise>>
来绕过此限制。
函数式编程人员的旁注: .then
既是Haskell术语中的map
和flatMap
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.