如何实现对数据库的异步调用 [重复]

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 并且它有效,谢谢!!!!

以上是关于如何实现对数据库的异步调用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何实现webservice的异步调用

如何在.NET中调用异步函数而不等待它[重复]

从构造函数调用的异步方法[重复]

当对异步任务使用丢弃(_)时,try catch 不会捕获被调用方法的内部异常[重复]

每个数组元素的异步调用并等待完成[重复]

java中如何设计异步调用接口,用监听实现异步结果的通知