Pongamos que queremos lanzar la misma función, que devuelve una promesa, pero con distintos parámetros.

Javascript dispone de la función Promise.all para ejecutar un array de promesas. Por ejemplo:

var f = funcionQueDevuelveUnaPromesa;
Promise.all([f(arg1), f(arg2), f(arg3)])
.then(_ => console.log("fin"));

En este ejemplo, las tres promesas se ejecutan en paralelo.  Es importante saber que Promise.all espera a que todo se cumpla o bien se produzca el primer rechazo.

Si queremos ejecutar estas operaciones de manera secuencial deberíamos conseguir algo del tipo:

f(arg1).then(_ => f(arg2)).then(_ => f(arg3));

Lo anterior es bastante parecido a lo que podemos conseguir con la función Array.reduce:

var f = funcionQueDevuelveUnaPromesa;
[arg1, arg2, arg3].reduce((cadenaPromesas, arg) => {
    return cadenaPromesas.then(_ => { return f(arg); });
}, Promise.resolve())
.then(_ => console.log("fin"));

Más complicado si las promesas son diferentes y/o tuviesen diferentes tipos de argumentos. En ese caso habría que usar bind en la llamada.