Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 错误:对异步系列使用pg PROMITE时已调用回调_Javascript_Node.js_Asynchronous_Promise_Pg Promise - Fatal编程技术网

Javascript 错误:对异步系列使用pg PROMITE时已调用回调

Javascript 错误:对异步系列使用pg PROMITE时已调用回调,javascript,node.js,asynchronous,promise,pg-promise,Javascript,Node.js,Asynchronous,Promise,Pg Promise,我无法理解打印的输出,为什么要执行此代码: 一, 2. 未处理的拒绝错误:已调用回调 当查询成功时,似乎会同时执行then和catch 有什么想法吗 干杯 async.series([ function(callback) { db.none(query) .then(function () { return callback(null, tru

我无法理解打印的输出,为什么要执行此代码:

一, 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
问题似乎来自代码的其余部分,只是一个简单的未定义函数错误,谢谢


但是我仍然不明白:为什么这个错误会在第二个查询中捕获,而不是在异步查询之外捕获?

您是否尝试在外部定义您的函数:

function onYourFunction() {
   console.log('Hi function');
}
然后,我会:

.then(onYourFunction)    //-->(onYourFunction without parentheses )
不幸的是,我不使用pg promise,但我可以提供建议

在这一点上,我做出了所有必要的承诺:

function createPromise(currObj) {
return new Promise(function (resolve, reject) {
    currObj.save(function (errSaving, savedObj) {
        if(errSaving){
            console.log("reject!");
            return reject(errSaving, response);
        }

        console.log('currObj:' + currObj);
        return resolve(savedObj);
    });
});
}

然后在级联中:

var allPromiseOs = Promise.all(promise1, promise2, promise3);
情况就是这样:

  • 回调(null,data)
    是在
    的上下文中调用的
    
  • async
    注意到这是该系列的最后一项,因此它调用最后一个处理程序(仍然在
    的上下文中)
    
  • 最后一个处理程序抛出一个错误
  • 由于代码在
    .then()
    的上下文中运行,promise实现捕获错误并调用
    .catch()
  • 这会再次调用回调
PoC:

我是这本书的作者

您不应该将
async
库与一起使用,这违反了共享/可重用连接的概念

通过任务正确使用同一连接实施:

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
    });
另见:

但是,在您的情况下,调用成功的
回调(null,data)
时,它会抛出一个错误,这反过来会导致在下面的
.catch
部分捕获它。要测试这一点,您可以如下更改承诺处理程序:

    .then(data => {
        callback(null, data);
    }, error => {
        callback(error, null);
    });
它通常应该抛出一个关于Promise missing的错误
。catch
,因为您在
中抛出了一个错误。然后
没有相应的
。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.你真的应该学会正确地使用承诺,避免任何回调。我只提供了一个与您自己的示例一致的示例,但一般来说,将承诺转换为回调是一种非常糟糕的编码技术。

您是否尝试过
console.log(err)
,看看它是否能让您了解问题所在?谢谢,我以为我已经做到了,但有时我忘记了最简单的事情:-)不要在承诺中使用async.js!!!我能问一下为什么吗?我不得不这么做,因为我正在使用pg promise模块来使用postgresBecause promises,因为您需要的所有实用程序都已经附带了承诺,而试图将回调放在它们之上只会导致类似这样的错误(通常是非常容易出错的代码)。如果回调失败,解决这一问题的方法是@Bergi,你最终还是会遭到未经处理的拒绝。是的,尽管我想这仍然比“错误:回调已经存在”要好(特别是因为几乎没有回调消费者检查这一点,甚至async.js也只是添加了它,因为错误行为让犯此错误的用户感到困惑)。在任何情况下,删除async.js可能是最好的解决方案
然后(…回调…)。catch(…回调…
仍然是错误的。请从您的示例代码中删除它。@Bergi这正是作者想要的,所以它很糟糕,但没有错,因为它可以工作。这就是我在代码示例之后添加注释的原因。虽然我自己也很喜欢承诺,但我试图在不说教的情况下对它们进行教育:)我的观点是,它确实不起作用。如果一个人绑定到回调,那么他至少应该使用而不是
catch
@Bergi为什么?我现在不明白。你所展示的与我所做的完全相同,除了返回回调结果,这是不相关的,而且根据蓝鸟的作者所说,这被认为是一种反模式:不,
。然后(res=>{callback(null,res)})。catch(err=>{callback(err)}
。然后(res=>{callback(null,res)},err=>{callback(err)})
。我们需要后者(请检查链接的答案)。
    .then(data => {
        callback(null, data);
    }, error => {
        callback(error, null);
    })
    .catch(error => {
        // if we are here, it means our callback(null, data) threw an error
    });