bai*_*idz 2 javascript node.js typescript
我为 Node 和浏览器创建了一个库,并想要调用一个以流响应的外部端点。由于该流可能永远不会结束,因此客户端应该能够中止该进程。
public async observe(): Promise<() => void> {
const abortController = new AbortController();
const response = await fetch('url', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: { /* ... */ },
signal: abortController.signal,
});
if (!response.ok) {
// handle error
}
setImmediate(async () => {
// parse response.body ( stream )
});
return () => {
abortController.abort();
};
}
Run Code Online (Sandbox Code Playgroud)
我使用它是setImmediate因为我必须首先返回 abort 函数,否则该函数将永远不会到达 return 语句,因为它会不断解析流。
不幸的setImmediate是,浏览器不支持(https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate?retiredLocale=de#browser_compatibility)
有人知道用什么代替吗?
有几个选择。
如果你想要一个微任务,你可以使用 Promise。
Promise.resolve().then(
() => console.log('there'));
console.log('hello');
Run Code Online (Sandbox Code Playgroud)
对于普通任务,您可以使用setTimeout;
setTimeout(() => console.log('there'));
console.log('hello');
Run Code Online (Sandbox Code Playgroud)
还有requestAnimationFrame. https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame
有人指出为什么不直接使用try finally. 但有一个问题,如果你在finally中处理流,那么当调用者获得该abort函数时就为时已晚了。但是,setImmediate如果您只返回流式传输的承诺和中止函数,而不是使用类似的东西,实际上会更干净。
例如。
public async observe(): Promise<() => void> {
const abortController = new AbortController();
const response = await fetch('url', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: { /* ... */ },
signal: abortController.signal,
});
if (!response.ok) {
// handle error
}
return {
abort: () => abortController.abort(),
promise: async () => {
// parse response.body ( stream )
}
};
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样调用 ->
const {abort, promise} = observe();
setTimeout(() => abort(), 5000); //abort in 5 seconds
await promise;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
700 次 |
| 最近记录: |