Une promesse, juste par exemple:
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
Après avoir appelé, puis la méthode sur la promesse:
P.then(doWork('text'));
La fonction doWork ressemble à ceci:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
Comment éviter de renvoyer une fonction interne dans doWork, pour accéder aux données des paramètres de promesse et de texte? Y a-t-il des astuces pour éviter la fonction intérieure?
javascript
promise
ecmascript-6
es6-promise
user3110667
la source
la source
bind
méthode hideuse ? - qui est également extrêmement lent.Réponses:
Vous pouvez utiliser
Function.prototype.bind
pour créer une nouvelle fonction avec une valeur passée à son premier argument, comme ceciet vous pouvez changer
doWork
pour,Maintenant,
text
sera réellement'text'
dansdoWork
etdata
sera la valeur résolue par la promesse.Remarque: veuillez vous assurer que vous attachez un gestionnaire de refus à votre chaîne de promesse.
Programme de travail: Live copy sur le REPL de Babel
la source
call
invoque une fonction sur place,bind
crée une nouvelle fonction, mais les deux acceptent un contexte d'exécution comme premier argument.La réponse la plus simple est peut-être:
Ou, puisque ceci est étiqueté
ecmascript-6
, en utilisant les fonctions fléchées:Je trouve cela très lisible et pas trop à écrire.
la source
Utilisez le curry.
la source
curriedDoWork
une promesse en faisantreturn new Promise()
sur la première ligne de cette fonction, la promesse est exécutée dès que vous appelezcurriedDoWork()
(comme vous le faites dans..then(curriedDoWork('text'))
Lodash offre une belle alternative pour cette chose exacte.
Ou, si vous souhaitez que votre fonction de succès n'ait qu'un seul paramètre (les résultats de la promesse remplie), vous pouvez l'utiliser de cette façon:
Cela s'attachera
text: 'myArgString'
authis
contexte dans la fonction.la source
La nouvelle réponse à cette question est d'utiliser des fonctions fléchées, qui lient automatiquement le «ceci» et sont beaucoup plus lisibles. Google pour les liens tels que: https://2ality.com/2016/02/arrow-functions-vs-bind.html
Vous pouvez définir le texte comme suit: this.text = 'text' P.then (data => doWork (data)); //this.text à l'intérieur de doWork sera évalué à 'text'.
Ceci est suggéré par jib ci-dessus et cela (ou ceci!) Devrait être la réponse acceptée maintenant.
la source