javascript - 错误 : Callback was already called when using pg-promise with async series

标签 javascript node.js asynchronous promise pg-promise

我无法理解为何执行此代码的打印输出:

1 2个 未处理的拒绝错误:已调用回调。

好像then和catch都是在查询成功的时候执行的

有什么想法吗?

干杯

    async.series([
            function(callback) {
                db.none(query)
                    .then(function () {
                        return callback(null, true);
                    })
                    .catch(function (err) {
                        return callback(err, null);
                    });
            },
            function(callback) {
                db.any(query)
                    .then(function (data) {
                        console.log('1')
                        return callback(null, data);
                    })
                    .catch(function (err) {
                        console.log('2')
                        console.log(err);
                        return callback(err, null);
                    });
            }
        ],
        function(err, results) {
           if (results && !results[1].isEmpty()) {
              // do something
           }
        });

编辑:

TypeError: results[1].isEmpty is not a function

问题似乎出在代码的其余部分,只是一个简单的未定义函数错误,谢谢。

但我还是不明白:为什么这个错误是在第二个查询中而不是在异步查询之外捕获的

最佳答案

我是 pg-promise 的作者.

你不应该将 async 库与 pg-promise 一起使用,它违背了共享/可重用连接的概念。

通过任务正确使用相同连接的实现:

db.task(t => {
    return t.batch([
        t.none(query1),
        t.any(query2)
    ]);
})
    .then(data => {
        // data[0] = null - result of the first query
        // data[1] = [rows...] - result of the second query

        callback(null, data); // this will work, but ill-advised
    })
    .catch(error => {
        callback(error, null); // this will work, but ill-advised
    });

另请参阅:Chaining Queries .

但是,在您的情况下,当您调用成功的 callback(null, data) 时,它会抛出一个错误,这反过来会导致它在以下 中被捕获。 catch 部分。要对此进行测试,您可以像这样更改您的 promise 处理程序:

    .then(data => {
        callback(null, data);
    }, error => {
        callback(error, null);
    });

它通常会抛出关于 Promise missing .catch 的错误,因为你在 .then 中抛出了错误并且没有相应的 .catch > 链接如下,您也可以通过以下代码查看:

    .then(data => {
        callback(null, data);
    }, error => {
        callback(error, null);
    })
    .catch(error => {
        // if we are here, it means our callback(null, data) threw an error
    });

P.S. 你真的应该学会正确使用 promises,并完全避免任何回调。我只提供了一个与你自己一致的例子,但一般来说,将 promises 转换为回调是一种非常糟糕的编码技术。

关于javascript - 错误 : Callback was already called when using pg-promise with async series,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42787151/

相关文章:

angularjs - 在heroku上上传时,如何将 "view engine to ejs"更改为Node js中的其他内容

javascript - javascript 中的异步等待 sqlite

swift - 具有并发和串行的异步任务

ios - 异步请求返回 nil

javascript - 如何从 View 内部获取 GridView 的客户端 ID 以在 javascript 中使用

javascript - 如何将参数数组传递到 Kendo 网格数据源?

javascript - Sinon stub 仅记录之前运行过的 react 调用

javascript - 一次显示 4 个 div 的无限循环

javascript - Node.js:异步回调 vs 同步回调 vs process.nextTick vs setTimeout

node.js - 如何使用 Node API 从 Google Cloud Storage 返回指定的图像大小?