忽略块: 要么我犯了错误,要么威士忌开始起作用了。(也不能排除我变傻的可能性。对此我很抱歉)
期望结果:
我原本希望 ReplaySubject 每2秒钟返回一个值,因为在调用 next()
之前每次等待两秒钟。
结果如下:
结果是等待了2秒钟,但所有的值同时输出。
相关代码如下:
import { ReplaySubject } from 'rxjs';
export const rs$: ReplaySubject<number> = new ReplaySubject();
rs$.subscribe({
next: (data) => console.log(data),
error: (error) => console.warn(error),
complete: () => console.log('ReplaySubject completed'),
});
const fakeAPIValuesOne: Array<number> = [7, 11, 13];
fakeAPIValuesOne.forEach(async (entry: number) => {
await wait(2000); // <--- Why does wait() not work?
rs$.next(entry);
});
function wait(milliseconds: number) {
return new Promise((resolve) => setTimeout(resolve, milliseconds));
}
问题:
我在这里做了什么根本性的错误?
如果您想尝试一下:https://stackblitz.com/edit/rxjs-wpnqvq?file=index.ts
编辑1:
setTimeout 也没有效果。 下面的代码与上面完全相同:
fakeAPIValuesOne.forEach((value: number) => {
setTimeout(() => {
rs$.next(value);
}, 2000);
});
我想知道 next()
如何覆盖这里的所有延迟?
编辑 2
问题已解决,正确答案已标记,谢谢! 您需要以下细节来运行您的 ts 文件的根级别等待。
package.json
请注意type部分:
{
"name": "playground",
"version": "1.0.0",
"description": "",
"main": "index.ts",
"scripts": {
"start": "nodemon index.ts",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "MIT",
"dependencies": {
"rxjs": "^7.5.5",
"ts-node": "^10.7.0",
"typescript": "^4.8.0-dev.20220507"
},
"type": "module"
}
nodemon.json
请考虑以下配置以避免错误:TypeError [ERR_UNKNOWN_FILE_EXTENSION]: 未知的文件扩展名“.ts”
{
"execMap": {
"ts": "node --loader ts-node/esm"
}
}
最后但并非最不重要的是 tsconfig.json。
{
"compilerOptions": {
"module": "ESNext",
"target": "ESNext",
"moduleResolution": "node",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"isolatedModules": true,
"noEmit": true,
"strict": true,
"lib": ["esnext", "DOM"]
}
}