# Promise waterfall

JavaScript promise is very useful, but if you have unpredictable tasks that depend on the previous task or can't run parallel, this syntax can be helpful. 

### Waterfall syntax

Start by prepare a promise function called run
```
const run = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(true);
    }, 1000);
  });
}
``` 

Then use reduce get the output of the previous task
``` 
Array.from({ length: 10 }).reduce(function(prev, curr) {
  return prev.then(() => {
    return run()
  })
}, Promise.resolve([]))
``` 

### Conclusion

Absolutely you can use another package like  [async](https://www.npmjs.com/package/async)  to solve this problem. But if you want to have a lightweight solution, it can help.





