如何返回嵌套promise的结果?

时间:2016-02-19 06:41:48

标签: javascript promise ecmascript-6

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

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

2 个答案:

答案 0 :(得分:2)

不要归还;这不是承诺如何运作,并且几乎会破坏它们的目的。修改你的函数,使它返回一个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);
} );

答案 1 :(得分:0)

所以,关键在于不返回任何东西。你不知道承诺什么时候会回来,所以返回并不意味着很多,因为代码不会等你的承诺。

而不是返回,在promise的回调中调用另一个函数来做你想做的事情:

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