繁体   English   中英

从承诺中退回未解决的承诺

[英]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()的库以不返回可随后的对象。

我看不出这里通常是什么反模式。 您可以returnawait async函数中的任何promise,thenable或plain值,就像您可以Promise.resolve它们或从then回调中返回它们一样。 这没有什么不寻常的,这就是完成的方式。

如果您想明确地返回承诺,而不是依赖于可能的同化,则可以始终在猫鼬查询中调用.exec() ,它将为您带来“真正的”承诺。

如此处https://stackoverflow.com/a/22724984/704894所述 ,不可能有Promise<Promise<value>>因为当您在.then处理程序中返回Promise时,它会自动解析(展开)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM