浏览器支持的 setImmediate() 等效项是什么?

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

有人知道用什么代替吗?

Kei*_*ith 5

有几个选择。

如果你想要一个微任务,你可以使用 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)