我有两个功能。一个从数据库中获取用户,另一个用户循环访问它们并将它们显示为列表:
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
?
答案 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);
});