【发布时间】:2021-05-16 04:07:18
【问题描述】:
我是 RxJS 初学者,我想让我的代码更简洁。
这是我写的代码,我在接收完成结果时遇到问题。
我想让我的代码更简洁,在订阅回调中获取结果,而不使用其他 Subject 来接收结果。
这是我的代码,rxjs 7.0.1:
import colors from 'colors/safe';
import { Subject } from 'rxjs';
import { throttle } from 'rxjs/operators';
interface IEventTask {
id: string,
createdTime: number
}
let global_counter: number = 0;
const mockHTTPRequest = async (event: IEventTask) => {
return (Promise.resolve().then(async () => {
await new Promise((resolve) => {
global.setTimeout(resolve, 1000);
});
if (event.id === '01') {
throw new Error(`error: ${event.id}`);
}
const result = `result: ${event.id}`;
// I don't know how to get result, so I publish to another Subscriber
subscriber.next(result);
return result;
}))
.catch((error) => {
console.error(error);
})
}
const subject = new Subject<IEventTask>();
subject
.pipe(
throttle(mockHTTPRequest, {
leading: true, trailing: true
})
)
.subscribe({
next: (value) => {
console.log(`${colors.blue(`starting`)} Task#${value.id} at: ${global_counter++}`);
},
error: (error) => {
console.error(error);
},
complete: () => {
// How can I get Promise resolved result here?
console.log(`completed`);
}
});
// It's not the code I want to use, but I don't know how to make it easy.
const subscriber = new Subject<string>();
subscriber.subscribe((result: string) => {
console.log(`${colors.green(`finished`)} ${result} at: ${global_counter++}`);
});
(async () => {
for (let i = 1; i <= 10; i++) {
await new Promise((resolve) => {
global.setTimeout(() => {
resolve(true);
}, 125);
});
const value: IEventTask = {
id: (i).toString().padStart(2, '0'),
createdTime: global_counter++
};
subject.next(value);
}
})();
非常感谢。
【问题讨论】:
标签: javascript typescript rxjs