【问题标题】:How to make a function wait for data to appear in the DB? NodeJS如何让函数等待数据出现在数据库中?节点JS
【发布时间】:2021-05-29 19:54:56
【问题描述】:

我正面临一个特殊的情况。

我有一个后端系统 (nodejs),它被 FE 调用(非常标准:))。这个端点(nodejs)需要调用另一个系统(外部)并获取它产生的数据并将它们返回给 FE。到目前为止,这一切似乎都很平常,但问题来了。

外部系统有异步处理,因此会立即响应我的请求,但仍在处理数据(将它们保存在数据库中),我必须从数据库中获取这些数据并将它们返回给 FE。

问题来了:最好(有效)的方法是什么?它通常只需要几秒钟,我很犹豫在函数内部创建一个循环以及数据出现在数据库中。

另一种方法是让外部系统在处理结束时调用端点(如果可能 - 需要与合作伙伴一起检查)并在原始函数中等待,直到调用该端点(不确定如何实现这一点 - 所以如果有任何文档、文章、教程……如果你能分享给大家,将不胜感激)

感谢您的想法!

【问题讨论】:

  • 您可以使用recursionsetImmediate/setInterval

标签: node.js asynchronous async-await


【解决方案1】:

我可以给你一个例子,它检查数据库,如果找不到记录则等待一段时间。例如,我建立了一个虚假的数据库连接。

// Mocking starts
ObjectID = () => {};
const db = {
    collection: {
        find: () => {
            return new Promise((resolve, reject) => {
                // Mock like no record found
                setTimeout(() => { console.log('No record found!'); resolve(false) }, 1500);
            });
        }
    }
}
// Mocking ends

const STANDBY_TIME = 1000; // 1 sec
const RETRY = 5; // Retry 5 times


const test = async () => {

    let haveFound = false;
    let i = 0;
    while (i < RETRY && !haveFound) {

        // Check the database
        haveFound = await checkDb();
        // If no record found, increment the loop count
        i++
    }
}

const checkDb = () => {
    return new Promise((resolve) => {
        setTimeout(async () => {

            record = await db.collection.find({ _id: ObjectID("12345") });
            // Check whether you've found or not the record
            if (record) return resolve(true);
            resolve(false);

        }, STANDBY_TIME);
    });
}


test();

【讨论】:

  • thx,我决定把主登录放在FE端...所以流程如下: 1)FE会触发初始请求..我会处理它并让FE知道“嘿,它开始了” 2)FE 将触发一个进度条,并开始每隔一段时间检查状态(类似于你在上面写的只是 FE 驱动的),谢谢,将其标记为正确答案:)
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 2020-11-06
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
相关资源
最近更新 更多