【问题标题】:Interrupting and canceling a queue of queries中断和取消查询队列
【发布时间】:2020-09-02 08:28:31
【问题描述】:

我有问题。我正在自己学习使用 Node 和 Express 的 Javascript,我不确定我在问什么,但我会尝试以某种方式解释自己。

我正在使用 Express,节点服务器对 GET 请求的响应时间很长。它由快速路由器处理。响应基本上是对我的数据库的SELECT 查询,它通过forEach 循环得到了相当长的回调。这个循环包含一些在每个循环周期触发的准备好的语句。这些查询中的每一个都有另一个回调来处理一些值、解析承诺等。

只是为了可视化结构:

router.get("/", (req, res, next) => {

  parser.on('end', function(p) {  // some event function
    db.query("SELECT * FROM aziende", function (err, result, fields) {  // first sql query (I'm using mysql2 npm packet)
      bigArray.forEach((item, index) => {
        if (condition) {
          db.execute(query, [item.prop1, item.prop2, item.prop3], function(err2, result2) { ... }); // first prepared statement with callback
        } else {
          db.execute(query2, [item.prop1, item.prop2, item.prop3], function(err3, result3) { ... }); // second prepared statement + callback
        }
      });
    });
  });

});

如您所见,这是一个非常嵌套的结构。

用户从浏览器上的按钮启动此过程。我想要做的是保证通过按下另一个“停止”按钮来随时停止该过程。但我不知道如何以及是否可以清理服务器的回调队列。我说的是数百个查询。 forEach 循环似乎很快就结束了,但回调队列可能需要几秒钟到几分钟(20-30 分钟)才能完成。如您所知,我无法一直阻止该用户。

希望你能帮忙。

P.S:我已经在使用 socket.io 来通知用户服务器的详细状态(通过使用浏览器上的进度条),所以如果我的问题的假设解决方案期望完成套接字技术,然后很受欢迎。

【问题讨论】:

    标签: javascript mysql node.js express


    【解决方案1】:

    您可以使用 async/await 样式而不是回调。 如果您单击 Stop 按钮,您可以返回拒绝的 Promise。

    【讨论】:

    • 当我拒绝承诺时,我如何真正停止查询?换句话说,我应该在 promise 的 .catch() 块中写什么?
    • 可能是这样的,即使我不确定它是否会停止查询。 function executeQueries() { return new Promise(async (resolve, reject) => { stopButton.addEventListener("click", reject, { once: true }); await Promise.all( bigArray.map((item, index) => condition ? db.execute(query, [item.prop1, item.prop2, item.prop3], function(err2, result2) { ... }); // first prepared statement with callback : db.execute(query2, [item.prop1, item.prop2, item.prop3], function(err3, result3) { ... }); // second prepared statement + callback resolve(); }); }
    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多