【发布时间】:2021-08-02 08:25:43
【问题描述】:
这是初始化我正在使用的 gRPC 服务器的代码:
export const initServer = async (finalPort: number): Promise<string> => {
let initStatus = 'initial';
gRPCserver.addService(webcomponentHandler.service, webcomponentHandler.handler);
// define the host/port for server
await gRPCserver.bindAsync(
`localhost:${finalPort}`,
grpc.ServerCredentials.createInsecure(),
(err: Error | null, port1: number) => {
if (err != null) {
console.error(err);
log.info('Biding Error');
initStatus = 'Binding Error';
}
// start the gRPC server
gRPCserver.start();
log.info(`startServer::gRPC server started, on port: ${port1}`);
initStatus = 'OK';
},
);
return initStatus;
};
我正在尝试将该 initStatus 返回到此函数:
type StartServerType = () => Promise<string | undefined>;
export const startServer: StartServerType = async (): Promise<string | undefined> => {
try {
let initStatusResponse;
// Get port
const finalPort = port();
await server.initServer(finalPort).then((res) => {
initStatusResponse = res;
log.info('INIT STATUS RESPONSE: ', initStatusResponse);
});
} catch (e: unknown) {
if (typeof e === 'string') {
return e.toUpperCase(); // works, `e` narrowed to string
}
if (e instanceof Error) {
return e.message; // works, `e` narrowed to Error
}
}
return 'started';
};
但我总是收到“initial”作为 initStatusResponse。我知道那里存在异步问题,但我看不到哪里。
提前致谢。
【问题讨论】:
-
根据我的经验,接受回调的函数很少返回 Promise - 所以
await gRPCserver.bindAsync.....不太可能按您的意愿工作 -
我同意,
bindAsync接受回调函数,因此它不返回 Promise,所以awaiting 毫无意义。下一行代码 (return initStatus;) 将在设置initStatus之前立即执行。 -
要明确
asyncawait与 Promises 一起使用,而不是任何模糊异步的东西 -
另外,您将
await和.then()语法混合在一起。你不能同时使用两者,完全摆脱.then()。 -
@JeremyThille - 不正确,您可以将两者混合使用 - 这不是一个好习惯:p
标签: javascript typescript grpc-node