要么我错了要么威士忌开始起作用了.(我也不想排除我会变傻的可能性.对此我很抱歉.)

Expectation:

我希望ReplaySubject每2秒返回一个值,因为我在调用next()之前等待了2秒(每次).

Result:

结果是等待了2秒,但所有值都是output simultaneously.

The code in question is here:

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));
}

Question:

我到底做错了什么?

如果你想试试:https://stackblitz.com/edit/rxjs-wpnqvq?file=index.ts

EDIT 1:

SetTimeout也没有效果.下面的代码与上面的代码完全相同:

fakeAPIValuesOne.forEach((value: number) => {
  setTimeout(() => {
    rs$.next(value);
  }, 2000);
});

我想知道next()怎么能覆盖这里所有的延迟?

EDIT 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]: 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"]
  }
}

推荐答案

以下注释摘自mozilla web docs here

Note: forEach需要一个同步功能.

forEach不等待promise .确保你知道

所以这个问题与ReplaySubject无关,不能在这个用例中使用forEach.

干杯

EDIT: Solved

import { ReplaySubject } from "rxjs";

export const rs$ = new ReplaySubject();

rs$.subscribe({
  next: (data) => console.log(data),
  error: (error) => console.warn(error),
  complete: () => console.log("ReplaySubject completed"),
});

const fakeAPIValuesOne = [7, 11, 13];

// That won't work:
// fakeAPIValuesOne.forEach(async (entry: number) => {
//   await wait(2000);
//   rs$.next(entry);
// });


// That will work
for (const element of fakeAPIValuesOne) {
  await wait(2000);
  rs$.next(element);
}

function wait(milliseconds: number) {
  return new Promise((resolve) => setTimeout(resolve, milliseconds));
}

Javascript相关问答推荐

为什么!逗号和空格不会作为输出返回,如果它在参数上?

如何用拉威尔惯性Vue依赖下拉?

如何在模块层面提供服务?

查找最长的子序列-无法重置数组

IF语句的计算结果与实际情况相反

在数组中查找重叠对象并仅返回那些重叠对象

将Node.js包发布到GitHub包-错误ENEEDAUTH

自定义图表工具提示以仅显示Y值

AJAX POST在控制器中返回空(ASP.NET MVC)

打字脚本中方括号符号属性访问和拾取实用程序的区别

当我点击一个按钮后按回车键时,如何阻止它再次被点击

判断函数参数的类型

Reaction即使在重新呈现后也会在方法内部保留局部值

如何在FiRestore中的事务中使用getCountFromServer

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行

用内嵌的含selenium的Java脚本抓取网站

Html/JS:如何在脚本执行前阻止呈现?

使用jQuery将表中的数据插入到文本区域

Nextjs Google自动补全给出了不正确的值

使用条件 Select 下拉菜单时更改元素的样式