Javascript 给定一系列承诺,我如何以最后一个承诺的回应有力地解决问题,同时确保所有承诺都成功解决?

Javascript 给定一系列承诺,我如何以最后一个承诺的回应有力地解决问题,同时确保所有承诺都成功解决?,javascript,ecmascript-6,promise,es6-promise,Javascript,Ecmascript 6,Promise,Es6 Promise,这些承诺将按以下顺序解决 Promise One (resolves in 200ms) Promise Two (resolves in 400ms) Promise Three (resolves in 1000ms) Promise Four (resolves in 300ms) Promise Five (resolves in 500ms) 考虑到在我的应用程序中,承诺的响应决定了应用程序的状态,当旧承诺的解析速度比新承诺慢时,我的应用程序状态将停滞 一个可能的实现是在前一个请求完

这些承诺将按以下顺序解决

Promise One (resolves in 200ms)
Promise Two (resolves in 400ms)
Promise Three (resolves in 1000ms)
Promise Four (resolves in 300ms)
Promise Five (resolves in 500ms)
考虑到在我的应用程序中,承诺的响应决定了应用程序的状态,当旧承诺的解析速度比新承诺慢时,我的应用程序状态将停滞

一个可能的实现是在前一个请求完成之前不启动下一个请求,但这将极大地阻碍用户的进度

编辑:

我可能遗漏了一些必要的上下文。我不知道什么时候会加上承诺。Promise.all无法在启动后向其添加项目,因此Promise.all可能不适用于我


对于一个更普通的用例,提供的答案可能会很好地工作,但不幸的是我的API有点太过健谈。

所以你希望所有承诺都真正完成,但只按照最新承诺的价值继续

0 - Requests Start
100
200 - Promise One
300 - Promise Four
400 - Promise Two
500 - Promise Five (Most recent application state)
600
700
800
900
1000 - Promise Three (Stagnant application state)
我会答应你的一切都对你有用吗?记住,如果任何承诺被拒绝,它就会拒绝


所以你希望所有承诺都能真正完成,但只按照最新承诺的价值继续进行

0 - Requests Start
100
200 - Promise One
300 - Promise Four
400 - Promise Two
500 - Promise Five (Most recent application state)
600
700
800
900
1000 - Promise Three (Stagnant application state)
我会答应你的一切都对你有用吗?记住,如果任何承诺被拒绝,它就会拒绝


创建一个新的承诺,该承诺在所有其他承诺都已解决时解决(使用
promise.all
),然后链接另一个承诺,该承诺与发送到
promise的iterable的最后一个元素的值解决。all

const pTimeout=(值,超时)=>
新承诺(解析=>setTimeout(解析、超时、值))
//采用与Promise相同的参数。除以
//最后一个元素的分辨率值
函数resolveWithLast(承诺){
回报承诺。全部(承诺)
.then(results=>results.pop())
}
最后决定([
pTimeout(1200),
pTimeout(2400),
pTimeout(31000),
pTimeout(4300),
pTimeout(5500)
])

。然后(value=>console.log(value))
创建一个新的承诺,该承诺在所有其他承诺都已解决时解决(使用
promise.all
),然后链接另一个承诺,该承诺与发送到
promise的iterable的最后一个元素的值解决。all

const pTimeout=(值,超时)=>
新承诺(解析=>setTimeout(解析、超时、值))
//采用与Promise相同的参数。除以
//最后一个元素的分辨率值
函数resolveWithLast(承诺){
回报承诺。全部(承诺)
.then(results=>results.pop())
}
最后决定([
pTimeout(1200),
pTimeout(2400),
pTimeout(31000),
pTimeout(4300),
pTimeout(5500)
])

。然后(value=>console.log(value))
使用ES2017 async/await,您可以通过执行以下操作来提高的可读性:

const pTimeout=(值,超时)=>
新承诺(解析=>setTimeout(解析、超时、值))
//采用与Promise相同的参数。除以
//最后一个元素的分辨率值
异步函数resolveWithLast(承诺){
const results=等待承诺。全部(承诺)
返回results.pop()
}
最后决定([
pTimeout(1200),
pTimeout(2400),
pTimeout(31000),
pTimeout(4300),
pTimeout(5500)

])。然后(value=>console.log(value))
使用ES2017 async/await,您可以通过执行以下操作来提高的可读性:

const pTimeout=(值,超时)=>
新承诺(解析=>setTimeout(解析、超时、值))
//采用与Promise相同的参数。除以
//最后一个元素的分辨率值
异步函数resolveWithLast(承诺){
const results=等待承诺。全部(承诺)
返回results.pop()
}
最后决定([
pTimeout(1200),
pTimeout(2400),
pTimeout(31000),
pTimeout(4300),
pTimeout(5500)

]).then(value=>console.log(value))
好主意!我将尝试一下,稍后再进行讨论。您可以通过将
.then()
回调更改为
results=>results.pop()
来提高此文件的可读性。这主意不错!我将尝试一下,稍后再进行讨论。您可以通过将
.then()
回调更改为
results=>results.pop()
关于您的编辑,您如何准确地调用函数来添加事后承诺?
我可能遗漏了一些必要的
code:pSo,该应用程序是一个表单,它的工作原理是在您回答问题时逐步更新表单。因此,每次回答问题时,都会创建一个新请求。我的想法是我可以聚合“主动”承诺,但问题是用户可以随时停止/开始回答问题。你为什么要首先创建一个数组?看起来数组结构是您的问题的核心,但是您没有提供足够的信息来建议其他方法。糟糕的是,没有数组。我把大括号拿出来,让它不那么模棱两可,但我尽量让它抽象,因为这是一个抽象的问题。我试图考虑一个好的方法来解决它,而不是发布当前的实现。关于您的编辑,您究竟是如何调用您的函数来在事实之后添加承诺?<代码>我可能已经排除了一点必要的代码:PSO,该应用程序是一个表单,它的工作原理是在您回答问题时逐步更新表单。因此,每次回答问题时,都会创建一个新请求。我的想法是我可以聚合“主动”承诺,但问题是用户可以随时停止/开始回答问题。你为什么要首先创建一个数组?看起来数组结构是您的问题的核心,但是您没有提供足够的信息来建议其他方法。糟糕的是,没有数组。我把牙套拿出来让它不那么模棱两可,但我试着把它保持在一个小范围内