【发布时间】:2020-07-23 17:56:10
【问题描述】:
我有带有 4 个异步函数的老式库 - 我们称它们为 libA、libB、libC、libD(每个函数的运行时间未知/随机) - 当它们完成时,它们调用我的回调
我编写了 loadString 函数,它返回 observable(它应该包含每个回调函数的结果 - 为了简单起见,我在这里使用字符串,但它可以是结果数组)但它给出了错误的结果“AADDDDD”。预期结果是“AADDDDDCCCCBBB”。如何正确使用 rxjs?
function loadString() {
let result = '';
return Observable.create(observer =>{
libA( n=> { result+='A'.repeat(n) });
libB( n=> { result+='B'.repeat(n) });
libC( n=> { result+='C'.repeat(n) });
libD( n=> {
result+='D'.repeat(n);
observer.next(result);
});
})
}
下面有工作的 sn-p,您可以将其复制到您的答案并开发 loadString 函数
// SET-UP
const { of, Observable } = rxjs;
const { map, switchMap, delay } = rxjs.operators;
// simulated lib function - not change this (the times are random)
function libA(callback) { setTimeout( _=>callback(2), 1000); }
function libB(callback) { setTimeout( _=>callback(3), 3000); }
function libC(callback) { setTimeout( _=>callback(4), 2000); }
function libD(callback) { setTimeout( _=>callback(5), 1500); }
// QUESTION: how to write below function body using rxjs?
function loadString() {
let result = '';
return Observable.create(observer =>{
libA( n=> { result+='A'.repeat(n) });
libB( n=> { result+='B'.repeat(n) });
libC( n=> { result+='C'.repeat(n) });
libD( n=> {
result+='D'.repeat(n);
observer.next(result);
});
})
}
// TEST
let s = loadString().subscribe(str=> {
console.log(str); // wrong result: I expected "AADDDDDCCCCBBB" value
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.min.js" integrity="sha256-85uCh8dPb35sH3WK435rtYUKALbcvEQFC65eg+raeuc=" crossorigin="anonymous"></script>
UPDAE
我不想按顺序运行 lib 函数,而是并行运行(它们向 API 发送一些请求...)
【问题讨论】:
-
提示:如果 libD 先完成会怎样?
-
This question 可能有用。
标签: javascript rxjs