Async/Await gRPC 方法未按预期工作
Async/Await not working as expected with gRPC method
这是初始化我正在使用的 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;
};
我正在尝试 return 这个函数的 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。我知道那里有一个异步问题,但我看不到哪里。
提前致谢。
您需要查看 gRPCserver.bindAsync
的文档,但似乎此方法不是 return promise 对象。发生这种情况的可能性会增加,因为您将回调函数作为参数传递。 Promise 对象消除了对回调函数的需要(通常称为“回调地狱”)。 Here is an article 解释了 Javascript/Typescript 中执行异步操作的不同方法之间的差异。
使用async/await 是一个很好的方法。为了在 gRPCserver.bindAsync
没有 return 承诺的情况下使用它,我们可以将其“包装”在承诺中。这可以使用 node.js 实用程序 promisify
轻松完成(Documentation) or manually with new Promise
. This article 很好地解释了这两种方式。
这是初始化我正在使用的 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;
};
我正在尝试 return 这个函数的 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。我知道那里有一个异步问题,但我看不到哪里。
提前致谢。
您需要查看 gRPCserver.bindAsync
的文档,但似乎此方法不是 return promise 对象。发生这种情况的可能性会增加,因为您将回调函数作为参数传递。 Promise 对象消除了对回调函数的需要(通常称为“回调地狱”)。 Here is an article 解释了 Javascript/Typescript 中执行异步操作的不同方法之间的差异。
使用async/await 是一个很好的方法。为了在 gRPCserver.bindAsync
没有 return 承诺的情况下使用它,我们可以将其“包装”在承诺中。这可以使用 node.js 实用程序 promisify
轻松完成(Documentation) or manually with new Promise
. This article 很好地解释了这两种方式。