如何实现对数据库的异步调用 [重复]
Posted
技术标签:
【中文标题】如何实现对数据库的异步调用 [重复]【英文标题】:How to implement async calls to db [duplicate] 【发布时间】:2019-11-29 15:59:06 【问题描述】:我需要帮助的朋友! 我需要在我的 REST API 中编写获取请求的函数。 在这个函数中,我需要通过 branchId 获取所有播放列表,并通过 playlistId 获取每个播放列表文件,并发送具有属性 [playlist, files, playlist, files, playlist, files] 的对象数组。
我认为我的函数需要是异步的。 我试了一下,但是当我想为每个播放列表获取文件时遇到了一些问题。
exports.findBranchePlaylists = async function(req, res)
let data = [];
let playlists = await Playlist.find(branch_id: req.params.branchId);
playlists.forEach(async (playlist) =>
let files = await File.find(playlistId: playlist._id );
data.push(playlist, files);
)
res.send(playlists);
;
我知道这是错误的代码,我想告诉你,我想做什么。 这段代码只给我发这个 - []。
【问题讨论】:
forEach 不支持 async/await 语法。将您的代码放在 FOR 循环中,它应该可以按预期工作。 【参考方案1】:不需要异步,可以使用promise或者回调函数
exports.findBranchePlaylists = function(req, res)
Playlist.find(branch_id: req.params.branchId)
.then(result =>
return result.map(plylist =>
File.find(playlistId: playlist._id )
.then(result => return playlist, result )
)
).then( result => res.send(result))
;
或者您可以将 for 循环与 async/await 一起使用,因为 async/await 不支持 forEach。
【讨论】:
它不起作用,它给了我一个空数组 变量名可能有错别字,请仔细查看。发现一个错字并更新了答案,更新了答案。 是的,我看到了 typeos,但它仍然不起作用 你正在为一系列承诺创建一个承诺 - 看起来你错过了一个Promise.all
电话
通过更简单的 async
/await
语法使用 Promise 有什么问题?【参考方案2】:
您的代码的问题是 forEach 循环不支持 await 语法(因为 forEach 不是异步的)。您可以将 forEach 更改为经典的 FOR 循环。 就我个人而言,我会这样做(所以 1 个电话会给我所有 id 的数据):
exports.findBranchePlaylists = async function(req, res)
let data = [];
let playlists = await Playlist.find(branch_id: req.params.branchId);
let files = await File.find('playlistId': $in: playlists.map( ele => ele._id) );
res.send(files);
;
【讨论】:
它返回给我这个 [] 我将每个更改为 for 并且它有效,谢谢!!!!以上是关于如何实现对数据库的异步调用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章