javascript - node异步问题
本文介绍了javascript - node异步问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
想要callback在findById之后执行,但又不能放在它的回调中,不然会执行多次。应该怎么办?
解决方案
软件是服务行业,要有服务意识……代码贴图没问题,可以看得很清晰,但是如果回答者想改你的代码,还得重新敲一遍…………
我看你已经用了 es6 的语法,所以正解肯定是 Promise,可以自己封装成 Promies
exports.findList = function(findObj, callback) {
Info.find(findObj, function(err, info) {
const promises = info.map(f => new Promise((resolve, reject) => {
f.image = f.images.split(",")[0];
User.findById(f.author_id, function(error, user) {
if (error) {
reject(error);
return;
}
f.author_name = user.name;
f.authro_avatar = user.avatar;
resolve(f);
});
}));
Promise.all(promises)
.then(function(values) {
// 成功的时候,这个 values 是所有 info 对象,
// 作为一个数组返回出来,而不是某一个
callback(null, values);
})
.catch(function(error) {
// 注意这里 error 是第一个失败 error
// 不是所有的 error
callback(error);
});
});
};
当然也可以用 Bluebird 提供的工具函数来封装 Promise
需要注意的是你这里运行了好多个异步调用,所以要一起返回的话,肯定也是好多个结果。所以注意 Promise.all
后面 then()
中的回调。
如果你要用 es5,建议你写成 es6 再 Babel。不过 Node 7.6+ 已经支持 es2017 的一些特性,所以其实不必在意这个问题。如果确实需要,就采用在 findById
回调中记数的办法,记满放大招(调用 callback)。
这篇关于javascript - node异步问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文