Promise.all().then() resolve?

前端 未结 3 559
隐瞒了意图╮
隐瞒了意图╮ 2020-11-30 20:11

Using Node 4.x. When you have a Promise.all(promises).then() what is the proper way to resolve the data and pass it to the next .then()?

I

3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-11-30 20:37

    But that doesn't seem like the proper way to do it..

    That is indeed the proper way to do it (or at least a proper way to do it). This is a key aspect of promises, they're a pipeline, and the data can be massaged by the various handlers in the pipeline.

    Example:

    const promises = [
      new Promise(resolve => setTimeout(resolve, 0, 1)),
      new Promise(resolve => setTimeout(resolve, 0, 2))
    ];
    Promise.all(promises)
      .then(data => {
        console.log("First handler", data);
        return data.map(entry => entry * 10);
      })
      .then(data => {
        console.log("Second handler", data);
      });

    (catch handler omitted for brevity. In production code, always either propagate the promise, or handle rejection.)

    The output we see from that is:

    First handler [1,2]
    Second handler [10,20]
    

    ...because the first handler gets the resolution of the two promises (1 and 2) as an array, and then creates a new array with each of those multiplied by 10 and returns it. The second handler gets what the first handler returned.

    If the additional work you're doing is synchronous, you can also put it in the first handler:

    Example:

    const promises = [
      new Promise(resolve => setTimeout(resolve, 0, 1)),
      new Promise(resolve => setTimeout(resolve, 0, 2))
    ];
    Promise.all(promises)
      .then(data => {
        console.log("Initial data", data);
        data = data.map(entry => entry * 10);
        console.log("Updated data", data);
        return data;
      });

    ...but if it's asynchronous you won't want to do that as it ends up getting nested, and the nesting can quickly get out of hand.

提交回复
热议问题