我有一些 VS Code 客户端,它使用以下方式向服务器发送请求:
client.sendRequest(req, cursor).then((answer)=> {
processing...
})
如果服务器(出于某种充分的原因)没有发送任何答案,会发生什么?
我怎样才能捕捉到这个案例并相应地显示一些消息?
假设您正在使用 https://github.com/microsoft/vscode-languageserver-node/blob/main/client/src/common/client.ts,一个有根据的猜测(未验证):与返回的承诺竞争并承诺在
setTimeout
完成后解决。使用 sendRequest
签名,您可以在其中传递取消令牌(然后您可以随时使用取消令牌。例如,如果承诺竞赛通过 setTimeout
承诺解决)。如果 sendRequest Promise 赢得了比赛,则 clearTimeout
来自 setTimeout Promise 的超时 ID。
代码可能行不通,因为我实际上没有尝试过,只是猜测:
const millis = // TODO
let timeoutID;
const cancelTokenSrc = new CancellationTokenSource();
const timeout = new Promise((resolve)=>{timeoutID=setTimeout(resolve,millis,cancelTokenSrc)});
const winner = await Promise.race(timeout, client.sendRequest(/**blah blah, */cancelTokenSrc.token));
if (winner === cancelTokenSrc) {
cancelTokenSrc.cancel();
// timed out.
} else {
clearTimeout(timeoutID);
// do stuff with winner
}