如何返回嵌套承诺的结果

How to return the result of a nested promise?

本文关键字:嵌套 承诺 结果 返回 何返回      更新时间:2023-09-26

我有两个函数。一个从数据库中获取用户,另一个循环访问它们并将其显示为列表:

store.findUsers = () => {
  function map (doc, emit) {
    if (doc.type === 'user') {
      emit(doc.createdAt)
    }
  }
  return db.query(map, {include_docs: true}).then(posts =>
    _.map(posts.rows, (post) => post.doc)
  )
}
store.getUserList = () => {
  store.findUsers().then(posts => {
    return _.map(posts, (post) => post)
  }).then(result => {
    return result
  })
}

我像这样使用函数:

var userList = store.getUserList()
console.log('User list:', userList)

但是,console.log('User list:', userList)不会输出任何内容。我认为这是因为return result store.getUserList()在嵌套的承诺中。

如何修改代码返回result

不要返回它;这不是承诺的工作方式,而且几乎会破坏它们的目的。修改函数,使其返回一个 promise:

store.getUserList = () => {
  return store.findUsers().then(posts => {
    return _.map(posts, (post) => post)
  }).then(result => {
    return result
  })
}

然后在调用函数时使用该承诺:

store.getUserList().then( userList => {
    console.log('User list:', userList);
} );

您还可以简化很多store.getUserList.then(result => { return result } ) 不执行任何操作,因此您可以删除它,实际上您的映射正在传递标识函数,因此它也不执行任何操作。整个函数定义等效于 store.getUserList = () => store.findUsers(); ,这似乎是一个相当无用的函数,而你可以直接调用store.findUsers();,并像这样使用它:

store.findUsers().then( userList => {
    console.log('User list:', userList);
} );

所以,这里的关键是不返回任何东西。你不知道承诺什么时候会回来,所以返回没有多大意义,因为代码不会等待你的承诺。

而不是返回,在 promise 的回调中调用另一个函数来执行您想要执行的任何操作:

doSomething.then((myData) => {
  somethingToDoWithData(myData);
});