如何返回嵌套承诺的结果
How to return the result of a nested promise?
我有两个函数。一个从数据库中获取用户,另一个循环访问它们并将其显示为列表:
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);
});
相关文章:
- 嵌套承诺会产生类似的效果
- 如何展平嵌套承诺依赖项
- 嵌套承诺
- 转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
- 嵌套承诺与q-io
- 如何将嵌套承诺与Q连锁?我可以'Don’我不能让它们按正确的顺序运行
- 在嵌套承诺链中重新引发异常
- 此代码中嵌套承诺的目的是什么
- 嵌套承诺执行不同步
- AngularJs $q.all 不会用混合的嵌套承诺来解决
- 使用模拟工厂在茉莉花中测试嵌套承诺
- angular.foreach 解析嵌套承诺
- 如何避免用$q嵌套承诺
- 如何返回嵌套承诺的结果
- Keystone.js嵌套承诺 -> foreach -> 列表查找范围问题
- 在 node.js 中返回延迟嵌套承诺
- 在 javascript 中进行嵌套承诺调用
- 嵌套承诺被卡住
- 简化嵌套承诺和循环
- 优化嵌套承诺