Error : Callback was already called when using pg-promise with async series
Error : Callback was already called when using pg-promise with async series
我无法理解为何执行此代码的打印输出:
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
问题似乎出在代码的其余部分,只是一个简单的未定义函数错误,谢谢。
但我还是不明白:为什么这个错误是在第二个查询中捕获的,而不是在异步查询外部捕获的?
您是否尝试过在外部定义您的函数:
function onYourFunction() {
console.log('Hi function');
}
然后做:
.then(onYourFunction) //-->(onYourFunction without parentheses )
不幸的是我不使用 pg-promise 但我可以建议 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);
事情是这样的:
callback(null, data)
在 .then()
; 的上下文中调用
async
注意到这是该系列的最后一项,因此它调用最终处理程序(仍在 .then()
的上下文中);
- 最终处理程序抛出错误;
- 因为代码在
.then()
的上下文中运行,promise 实现捕获错误并调用 .catch()
;
- 这会再次调用回调;
PoC:
const async = require('async');
async.series([
callback => {
Promise.resolve().then(() => {
callback(null);
}).catch(e => {
callback(e);
});
}
], err => {
throw Error();
})
我是 pg-promise 的作者。
你不应该将 async
库与 pg-promise 一起使用,这违背了 shared/reusable 连接的概念。
通过任务正确使用相同的连接实现:
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
部分中被捕获。要对此进行测试,您可以像这样更改您的承诺处理程序:
.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,并完全避免任何回调。我只是提供了一个与你自己一致的例子,但一般来说,将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
问题似乎出在代码的其余部分,只是一个简单的未定义函数错误,谢谢。
但我还是不明白:为什么这个错误是在第二个查询中捕获的,而不是在异步查询外部捕获的?
您是否尝试过在外部定义您的函数:
function onYourFunction() {
console.log('Hi function');
}
然后做:
.then(onYourFunction) //-->(onYourFunction without parentheses )
不幸的是我不使用 pg-promise 但我可以建议 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);
事情是这样的:
callback(null, data)
在.then()
; 的上下文中调用
async
注意到这是该系列的最后一项,因此它调用最终处理程序(仍在.then()
的上下文中);- 最终处理程序抛出错误;
- 因为代码在
.then()
的上下文中运行,promise 实现捕获错误并调用.catch()
; - 这会再次调用回调;
PoC:
const async = require('async');
async.series([
callback => {
Promise.resolve().then(() => {
callback(null);
}).catch(e => {
callback(e);
});
}
], err => {
throw Error();
})
我是 pg-promise 的作者。
你不应该将 async
库与 pg-promise 一起使用,这违背了 shared/reusable 连接的概念。
通过任务正确使用相同的连接实现:
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
部分中被捕获。要对此进行测试,您可以像这样更改您的承诺处理程序:
.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,并完全避免任何回调。我只是提供了一个与你自己一致的例子,但一般来说,将promise转换为回调是一种非常糟糕的编码技术。