2017-06-14 9 views
2

Ich möchte eine gefälschte Diskussion in JS mit Versprechungen erstellen.

console.log Warte X Sekunden,
console.log Warte X Sekunden ...

ist hier mein Code:Versprechen Verkettung gleiche Funktion

var addMessage = function (msg) { 
    return new Promise(function (resolve, reject) { 
    setTimeout(function() { 
     console.log(msg) 
     resolve() 
    }, 2500) 
    }) 
} 

var scenario = function() { 
    addMessage('Hello who are you ?') 
    .then(addMessage('Hello I am John')) 
    .then(addMessage('Nice too meet you')) 
    .then(addMessage('Me too')) 
    .then(addMessage('Good Bye')) 
    .then(addMessage('Bye')) 
} 

scenario() 

Aber mit diesem Code alle console.log() auf der gleichen gemacht Zeit (nach 2500ms), ich bin neu mit Versprechungen und ich beherrsche sie wirklich nicht.

Vielen Dank!

+3

'dann()' erwartet eine Funktion, aber 'addMessage()' gibt ein Versprechen. Ein Versprechen ist keine Funktion. Und alle deine Versprechen werden zur selben Zeit erstellt, deshalb feuern sie gleichzeitig – Thomas

+0

"Ich möchte eine falsche Diskussion in JS mit Versprechen erstellen." Warum mit Versprechen? IMO die Versprechungen verkomplizieren hier nur die Dinge und bringen keinen Nutzen. – Thomas

+0

Mögliches Duplikat von [ES6 verspricht: wie man Funktionen mit Argumenten kettet] (https://stackoverflow.com/questions/36627845/es6-versprechen-wie-zu-kettenfunktionen-mit-argumenten) – jib

Antwort

4

Thomas hat es ziemlich gut in seinem Kommentar zusammengefasst:

dann() erwartet eine Funktion, aber addMessage() gibt ein Versprechen. A Versprechen ist keine Funktion. Und alle Ihre Versprechen am gleichzeitig erstellt werden, das ist, warum sie zur gleichen Zeit feuern

Sie bauen alle neuen Versprechungen zugleich so werden sie sofort ausführen und die Zeitgeber wird dann auch gleichzeitig Ende gleichzeitig. Um dies zu verringern, können Sie addMessage in eine Funktion innerhalb der .then Anrufe umbrechen.

addMessage('Hello who are you ?') 
    .then(function() { addMessage('Hello I am John') }) 
    .then(function() { addMessage('Nice too meet you') }) 
    .then(function() { addMessage('Me too') }) 
    .then(function() { addMessage('Good Bye') }) 
    .then(function() { addMessage('Bye') }) 

Alternativ können Sie auch Function.prototype.bind() verwenden, um zu vermeiden eine anonyme Funktion jedes Mal zu schreiben.

addMessage('Hello who are you ?') 
    .then(addMessage.bind(null, 'Hello I am John')) 
    .then(addMessage.bind(null, 'Nice too meet you')) 
    .then(addMessage.bind(null, 'Me too')) 
    .then(addMessage.bind(null, 'Good Bye')) 
    .then(addMessage.bind(null, 'Bye')) 

Und natürlich, wenn Ihre Umgebung eine aktuelle Version von JavaScript ausgeführt wird Sie auch arrow functions verwenden:

addMessage('Hello who are you ?') 
    .then(() => addMessage('Hello I am John')) 
    .then(() => addMessage('Nice too meet you')) 
    .then(() => addMessage('Me too')) 
    .then(() => addMessage('Good Bye')) 
    .then(() => addMessage('Bye')) 

In naher Zukunft werden Sie auch die await keyword nutzen können, die die Notwendigkeit beseitigt vollständig für alle .then Anrufe:

await addMessage('Hello who are you ?') 
await addMessage('Hello I am John') 
await addMessage('Nice too meet you') 
await addMessage('Me too') 
await addMessage('Good Bye') 
await addMessage('Bye') 
+0

Arbeiten Sie wie ein Charme! –

+0

Ich bevorzuge es in den meisten Fällen, da es die Leute davon abhält, viel prozeduralen Code zu schreiben. –

Verwandte Themen