如何处理承诺,因为他们解决?

目前,这个代码打印出一个零,因为数组中的第一个承诺立即解决。

const promises = []; const promiser = (number) => new Promise((resolve, reject) => window.setTimeout(() => resolve(number), number * 100)); for (let index = 0; index < 10; index++) { const promise = promiser(index); promises.push(promise); } Promise.race(promises).then(r => console.debug(r)); 

我期待这样做,以便一旦最快的承诺解决,它是从promises数组中删除和一个新的Promise.race调用剩下的承诺,重复,直到没有承诺离开。

由于Promise.race返回的是承诺的结果,而不是解决的承诺本身,但是,我无法确定哪个承诺是解决的,我不知道哪一个从数组中删除。 有没有办法知道这个? 我想我可以用某种相关键和结果返回一个复杂的对象,但这似乎很奇怪。 我希望Promise.racecallback的第二个参数将是承诺的索引,但事实并非如此,因为then只是另一个承诺的一个,所以它怎么会知道它应该无论如何返回一些索引。 你能想出更好的办法吗?

而且,我在第一race执行了所有的承诺,但是这对后来的race来说应该不成问题,对吗? 如果在接下来的race之前另一个承诺解决了,那么应该把它退还,没问题,对吗? 如果同时有多个承诺解决,它只会返回第一个(按照数组顺序或按照分辨率顺序?),然后下一个race将返回第二个,依此类推…对吗?

顺便说一句,我也尽pipe我可以走arrays,并删除已经isResolved承诺,但这不是一个真实的事情。 即使是这样,但是对于race诉求之间的多重承诺解决的情况来说,这完全是race

您可以将标识符返回给承诺

 const promises = []; const promiser = (number, id) => new Promise((resolve, reject) => window.setTimeout(() => resolve({ number, id }), number * 100)); for (let index = 0; index < 10; index++) { const promise = promiser(index, "id_" + index); promises.push(promise); } Promise.race(promises).then(r => console.debug(r.id)); 

无论如何,如果你正在使用蓝鸟这样的承诺库,你可以find一些工具来帮助你更好地构build代码(比如Promise.reduce或者Promise.any

我期待这样做,以便一旦最快的承诺解决,它是从promises数组中删除和一个新的Promise.race调用剩下的承诺,重复,直到没有承诺离开。

如果你最终想要处理所有的承诺,你为什么要使用Promise.race ? 你不能简单地处理每一个承诺,只要它解决,然后等待,直到所有的承诺已经处理?

 const promises = []; const promiser = (number) => new Promise((resolve, reject) => window.setTimeout(() => resolve(number), number * 100)); for (let index = 0; index < 10; index++) { const promise = promiser(index) .then(r => process(r)); // process every promise individually promises.push(promise); } Promise.all(promises) // wait for all promises to be processed .then(r => console.debug('all done!')); 

或者, process 也是asynchronous的,你需要确保一次只能处理一个promise。