NodeJS async/await 和函数调用
NodeJS async/await and function call
我 运行 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> }
你必须 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());
})();
async functions
return 一个 Promise,因此您需要等待它或使用 .then()
才能获得结果。
请记住,await
只能在 async function
中使用,因此您需要更改代码结构。
我建议您查看 documentation 以及 Javascript 中的异步编程的更多信息。
像这样保持你的第一个代码,它可以像这样修复(在我看来仍然有点奇怪):
function a() {
return pgPromise.one('SELECT 1')
.then(row => {
return row;
})
.catch(error => {
console.log(error);
});
}
a().then(console.log);
如果您想使用 async/await,这个示例可能对学习很有帮助:
async function a() {
const row = await pgPromise.one('SELECT 1');
return row;
}
a().then(console.log).catch(console.error);
在这种情况下,错误处理是在函数外部完成的,在调用方(它可以通过 try/catch 在内部完成,这取决于用例)。
我 运行 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> }
你必须 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());
})();
async functions
return 一个 Promise,因此您需要等待它或使用 .then()
才能获得结果。
请记住,await
只能在 async function
中使用,因此您需要更改代码结构。
我建议您查看 documentation 以及 Javascript 中的异步编程的更多信息。
像这样保持你的第一个代码,它可以像这样修复(在我看来仍然有点奇怪):
function a() {
return pgPromise.one('SELECT 1')
.then(row => {
return row;
})
.catch(error => {
console.log(error);
});
}
a().then(console.log);
如果您想使用 async/await,这个示例可能对学习很有帮助:
async function a() {
const row = await pgPromise.one('SELECT 1');
return row;
}
a().then(console.log).catch(console.error);
在这种情况下,错误处理是在函数外部完成的,在调用方(它可以通过 try/catch 在内部完成,这取决于用例)。