gpt4 book ai didi

javascript - 在列表上异步操作时保留结果顺序

转载 作者:行者123 更新时间:2023-11-30 11:40:28 25 4
gpt4 key购买 nike

我有一个处理来自列表的请求的异步函数,但是当每个请求完成时,它并没有像声明之前那样排序(因为它是异步的)。如何异步获取但保留原始顺序?

这是 fiddle http://jsbin.com/papunixume/edit?html,js,console

// clear console every single run
console.clear()

// create promise
const cp = (msg, timeout) => {
return new Promise(resolve => {
setTimeout(() => {
resolve(msg)
}, timeout)
})
}

const a = cp('a', 1000)
const b = cp('b', 500)
const c = cp('c', 800)

Rx.Observable.of([a, b, c]).subscribe(val => {
val.map(res => {
res.then(x => console.log(x))
})
})

结果是

"b"
"c"
"a"

预期

"a"
"b"
"c"

最佳答案

这实际上取决于您需要使用 Promise 做什么以及如何使用。你现在拥有的根本不需要 RxJS,因为你只是创建了一个 Promise 数组,然后对每个 Promises 调用 then()

如果您想以更多“RxJS 方式”进行操作,您可以在 Promises 到达时收集结果,同时使用 concatMap() 运算符保持相同的顺序:

Rx.Observable.from([a, b, c])
.concatMap(promise => promise)
.subscribe(val => console.log(val));

魔法发生在 concatMap() 内部,因为它识别 Promise 类的实例并以特殊方式处理它们(用 then() 链接它们并重新发出它们的结果)。

查看演示:http://jsbin.com/gobayoy/4/edit?js,console

或者您可以等到所有 Promise 完成,然后使用 forkJoin() 将它们的所有结果作为单个数组发出:

Rx.Observable.forkJoin(a, b, c)
.subscribe(val => console.log(val));

查看演示:http://jsbin.com/zojuya/2/edit?js,console

同样,RxJS 会自动处理 Promise,因此 forkJoin() 能够等待所有 Promise 完成,而无需您担心。

关于javascript - 在列表上异步操作时保留结果顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42886224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com