如何解决承诺?

Tom*_*uer 2 javascript node.js promise typescript es6-promise

目前,此代码打印出零,因为数组中的第一个promise立即解析.

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));
Run Code Online (Sandbox Code Playgroud)

我希望这样做,以便一旦最快的承诺解决,它将被从promises数组中删除,并Promise.race与剩余的承诺进行新的调用,重复直到没有任何承诺.

由于Promise.race承诺,而不是解决的承诺本身的返回结果,虽然,我不能确定哪些承诺是它是解决了,我不知道从数组中删除哪一个.有没有办法知道这个?我想我可以使用某种相关键和结果返回一个复杂的对象,但这看起来很奇怪.我希望Promise.race回调的第二个参数是promise的索引,但事实并非如此,它也没有意义,因为then它只是then另一个promise,所以它怎么会知道它应该返回一些索引.你能想到一个更好的方法吗?

另外,我用第一个承诺所有的承诺race,但这不应该成为后续race的问题,对吧?如果在随后的race调用之前同时解决了另一个承诺,它应该只返回它,没问题,对吗?如果多个承诺在此期间确实解决了,它只会返回第一个(按照数组顺序或分辨率顺序?)然后下一个race将返回第二个等等......对吧?

顺便说一下,我也可以走数组并删除有的承诺isResolved,但这不是真的.尽管如此,即使多次承诺在调用之间解决,情况也会完全破坏race.

Mat*_*ens 5

我希望这样做,以便一旦最快的承诺解决,它将被从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!'));
Run Code Online (Sandbox Code Playgroud)

或者process 也是异步的,您需要确保一次只处理一个承诺?