# Promise.inSeries()

[JS](../../..) ⟩ [async](../..) ⟩ [Promise](..) ⟩ [chaining]() ⟩ Promise.inSeries()

{% tabs %}
{% tab title="💾 程式" %}
:floppy\_disk: replit：[Promise in series](https://replit.com/@pegasusroe/Promises-in-series#index.js)

```javascript
// 🔸 Promise.inSeries()
Promise.inSeries = function(promises) {

    // store results from promises 
    const results = [];
    
    // ⭐ start with a "trivial" Promise
    let p = Promise.resolve();

    // ⭐ Promise chain of arbitrary length
    for (const promise of promises) {
        p = p.then(value => {
            results.push(value);    // save resolved value
            return promise;         // return next promise
        });
    }

    // ⭐ return a Promise for `results`.
    return p.then(value => {
        results.push(value); // ⭐ save last resolved value
        results.shift();     // ⭐ remove value from first "trivial" promise
        return results;
    });
    
};
```

💈範例：

```javascript
// test 1
Promise.inSeries([
    Promise.resolve(1),
    Promise.reject('error in promise #2'),
    Promise.resolve(3),
]).then(results => 
    console.log(results)
).catch(error => {
    console.log(error)        // ⛔ rejected: "error in promise #2"
});

// test 2
Promise.inSeries([
    new Promise(resolve => setTimeout(resolve, 2000, 1)),
    new Promise(resolve => setTimeout(resolve, 1000, 2)),
    Promise.resolve(3),
]).then(results => 
    console.log(results)      // ✅ fulfilled: [ 1, 2, 3 ]
).catch(error => {
    console.log(error)
});
```
{% endtab %}

{% tab title="📗 參考" %}
* [ ] JavaScript: The Definitive Guide (13.2.7 Promises in Sequence)
{% endtab %}
{% endtabs %}
