2016-07-08 12 views
0

Ich möchte eine Funktion mit einem Parameter ausführen, der aus einem Array von Werten eine Schleife bildet. Jede Ausführung muss warten, bis die vorherige abgeschlossen ist. Der Beispielcode sollte unter Druck:Serielle Ausführung der Zusage

Done: 1 
Done: 2 
Done: 3 
Done: 4 
Done: 5 

Dank!

p.

'use strict'; 

function f1(value) { 
    return new Promise((resolve, reject) => { 
     setTimeout(function() { 
      console.log('Done: ' + value); 
      resolve(true) 
     }, Math.random() * 2000 + 1000); 
    }); 
} 

const vs = [0,1,2,3,4,5]; 

vs.reduce((start, next) => { 
    return f1(next) 
}) 
+0

Ich habe dies mit eckigenjs gemacht verspricht aber genau das gleiche kann mit nativen getan werden. https://gist.github.com/ste2425/608b74d20504d526d2c08dd8fa76f675 – ste2425

Antwort

2

Wenn Sie nur ES6 wollen, versuchen Sie dies:

'use strict'; 

function f1(value) { 
    return new Promise((resolve, reject) => { 
     setTimeout(function() { 
      console.log('Done: ' + value); 
      resolve(true) 
     }, Math.random() * 2000 + 1000); 
    }); 
} 

const vs = [0,1,2,3,4,5]; 

let promiseChain = vs.reduce((start, next) => { 
    return start.then(() => f1(next)); 
}, Promise.resolve()); 

promiseChain.then(() => console.log('Done!')); 

Wenn Sie daran interessiert sind, die Werte aus den Auflösungen bekommen, Sie this auch versuchen können.

+1

Es ist was ich versuchen würde zu tun! Danke – goliardico

+1

Oder einfach 'vs.reduce ((p, v) => p.then (() => f1 (v)), Promise.resolve())'. – jib

+0

Richtig, gleiche Sache. Ich habe mich für mehrere Zeilen entschieden und die Variablennamen aus der Frage wieder verwendet, um die Lesbarkeit (hoffentlich) zu verbessern. – dvlsg