Javascript 错误:对异步系列使用pg PROMITE时已调用回调
我无法理解打印的输出,为什么要执行此代码: 一, 2. 未处理的拒绝错误:已调用回调 当查询成功时,似乎会同时执行then和catch 有什么想法吗 干杯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
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
的上下文中)李>
- 最后一个处理程序抛出一个错误李>
- 由于代码在
的上下文中运行,promise实现捕获错误并调用.then()
李>.catch()
- 这会再次调用回调李>
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
});