如何处理承诺,因为他们解决?
目前,这个代码打印出一个零,因为数组中的第一个承诺立即解决。
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.race
callback的第二个参数将是承诺的索引,但事实并非如此,因为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。