【问题标题】:Ensure a Callback is Complete in Mongo Node Driver确保在 Mongo 节点驱动程序中完成回调
【发布时间】:2022-01-05 17:32:44
【问题描述】:

我对 JavaScript Web 开发有点陌生,所以我仍然对异步函数的流程有所了解,这对于外行来说可能有点出乎意料。在我的特定用例中,我想在进入主代码之前在可用数据库列表上执行一个例程。具体来说,为了确保始终正确初始化测试环境,如果数据库已经存在,我将删除它,然后从配置文件构建它。

我的基本流程是这样的:

let dbAdmin = client.db("admin").admin();
dbAdmin.listDatabases(function(err, dbs){/*Loop through DBs and drop relevant one if present.*/});
return await buildRelevantDB();

通过在整个过程中添加一些console.log() 项目,我确定listDatabases() 调用基本上将回调放入排序队列中。我实际上输入了buildRelevantDB()之前进入传递给listDatabases的回调。在这个特定的示例中,它似乎仍然有效,我认为因为读取配置文件的调用也是异步的,因此将项目放入同一个队列但稍后,但我发现这很脆弱和草率。必须有某种方法来确保listDatabases 部分在继续前得到解决。

我找到的最接近的解决方案是 here,但我仍然不知道如何让我传递给 listDatabases 的回调像该解决方案中的 then

【问题讨论】:

    标签: node.js mongodb asynchronous


    【解决方案1】:

    混合回调和承诺是一种更高级的技术,所以如果您是 javascript 新手,请尽量避免使用它。事实上,即使你已经学会了一切并成为了一个 js 忍者,也要尽量避免它。

    listDatabases 的文档表示它是异步的,因此您可以等待它而不会弄乱回调:

    const dbs = await dbAdmin.listDatabases();
    /*Loop through DBs and drop relevant one if present.*/
    

    接下来,在return之前不需要await。如果你可以在函数中await,它就是async,并且无论如何都会返回一个promise,所以只需从buildRelevantDB 返回promise:

    return buildRelevantDB();
    

    最后,您可以直接drop database。无需遍历所有数据库来选择要删除的数据库:

    await client.db(<db name to drop>).dropDatabase();
    

    【讨论】:

    • 谢谢。当我像使用常规语言一样使用 JS 时,我对它很好,但是这些异步库正在杀死我。所以删除一个不存在的数据库不是错误吗?另外,我正在执行“return await func()”,因为我返回的是值而不是承诺,但也许这对我来说还是太新了。
    • 是的,删除一个不存在的数据库是可以的。如果有疑问,请将其包裹在 try-catch 中。即使您毫无疑问,这也是一件好事——毕竟它是一个远程数据库。不,你不返回值,你返回一个 Promise。一旦你声明了一个函数async,它只返回一个promise。 Async/await 只是一个语法糖,下面都是 Promise。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2018-09-29
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多