我正在与NodeJS
一起运行pg-promise
,以访问我的PostgreSQL
。
这是我的测试,失败了,undefined
:
function a() {
pgPromise.one('SELECT 1')
.then(row => {
return row;
})
.catch(error => {
console.log(error);
});
}
console.log(a());
我认为它以undefined
失败,因为它正在异步运行。
我尝试使用以下方法进行优化:
async function a() {
var output = null;
await pgPromise.one('SELECT 1')
.then(row => {
output = row;
})
.catch(error => {
console.log(error);
});
return output;
}
console.log(a());
但这只是给我:
[2018-09-13 08:37:09.521] [LOG] Promise { <pending> }
答案 0 :(得分:2)
您必须await
来获得结果,这样一来,您就不会得到承诺,而是得到了解决的结果:
console.log(await a());
但是您的代码太复杂了。您的a
函数没有任何实际意义。
更改
async function a() {
var output = null;
await pgPromise.one('SELECT 1')
.then(row => {
output = row;
})
.catch(error => {
console.log(error);
});
return output;
}
到
async function a() {
try {
return await pgPromise.one('SELECT 1')
} catch(error) {
console.log(error);
}
}
如果您在await
上遇到语法错误,则可能意味着您不在async
函数中。节点中的典型情况是您在根目录。最简单的解决方案是将其包装在async
函数中:
;(async function(){
console.log(await a());
})();
答案 1 :(得分:1)
async functions
返回一个Promise,因此您需要等待它或使用.then()
来获得结果。
请记住,await
只能在async function
内部使用,因此您需要更改代码的结构。
我建议您检查documentation以及有关Java异步编程的更多信息。
保持这样的第一个代码,就可以这样修复(我认为还是有点奇怪):
function a() {
return pgPromise.one('SELECT 1')
.then(row => {
return row;
})
.catch(error => {
console.log(error);
});
}
a().then(console.log);
如果您想使用异步/等待,此示例可能对学习有帮助:
async function a() {
const row = await pgPromise.one('SELECT 1');
return row;
}
a().then(console.log).catch(console.error);
在这种情况下,错误处理是在函数外部,调用方进行的(可以通过try / catch在内部完成,具体取决于用例)。