gpt4 book ai didi

javascript - 在函数中调用函数时异步 Javascript 上下文中的最佳实践?

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:03 24 4
gpt4 key购买 nike

我试图调用两个函数并将第一个函数的输出作为参数传递给第二个函数。

函数1:

module.exports.getAllStatisticsByUserId = function(id, callback){
User.findById(id, (err, user) =>{
if(err)
throw err;
if(user)
callback(null, user.statistics);

});
}

函数2:

module.exports.getGameByStatisticsId = function(id, callback){

Statistics.findById(id, (err, statistics) =>{
if(err)
throw err;
if(statistics)
callback(null, statistics.game);
});
};

我试图通过将第一个方法的输出作为参数传递来执行第二个方法,但 javascript 的异步性质把它弄乱了。我尝试过兑现 promise ,但没有成功。

任何人都可以建议一些好的 JavaScript 实践来处理彼此需要时异步调用函数吗?任何帮助将不胜感激。

最佳答案

修复后the issue I mentioned above ,您可以像这样依次调用它们:

module.exports.getAllStatisticsByUserId = function(id, callback){
User.findById(id, (err, user) =>{
if(err) callback(err);
if(user) callback(null, user.statistics);
});
};

module.exports.getGameByStatisticsId = function(id, callback){
Statistics.findById(id, (err, statistics) =>{
if(err) callback(err);
if(statistics) callback(null, statistics.game);
});
};
someService.getAllStatisticsByUserId(id, (err, statistics) => {
if (err || !statistics) {
// handle error
return;
}

someService.getGameByStatisticsId(statistics.id, (err, game) => {
if (err || !game) {
// handle error
return;
}

// handle game
});
});

但是,如上所述in Mongoose documentation :

When a callback function is not passed, an instance of Query is returned, which provides a special query builder interface. A Query has a .then() function, and thus can be used as a promise.

所以你可以像这样简单地重写调用:

someService.getAllStatisticsByUserId(id).then(statistics =>
someService.getGameByStatisticsId(statistics.id)
).then(game => {
// handle game
}).catch(err => {
// handle error
});

或将其转换为async/await函数:

async function getGameByUserId(id) {
try {
const statistics = await someService.getAllStatisticsByUserId(id);
const game = await someService.getGameByStatisticsId(statistics.id);

// handle game
} catch (error) {
// handle error
}
}

请注意,async 函数始终返回 Promise,因此您必须 await 它或将其与 .then() 链接起来,以确保查询完成并解析返回值(如果有)。

关于javascript - 在函数中调用函数时异步 Javascript 上下文中的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49014057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com