J'ai du code comme:
var bar = foo().then(function success(value) {
// compute something from a value...
}, function failure(reason) {
// handle an error...
});
Comment lier la fonction failure
à l'objet this
dans le contexte de bar
. Je sais que je devrai utiliser myFunc.bind(this)
mais que dois-je substituer à la place de myFunc
?
Vous pouvez utiliser bind
comme ceci:
var bar = foo().then(function success(value) {
// compute something from a value...
}, function failure(reason) {
// handle an error...
}.bind(this));
Vous disposez actuellement d'une fonction anonyme (bien qu'étiquetée) pour votre rappel d'échec:
function failure(reason) {
// handle an error...
}
Comme le dit robertklep, vous pouvez immédiatement appeler .bind
sur cette fonction anonyme. Cependant, il pourrait être plus lisible d'utiliser une fonction nommée à la place et de la transmettre à .then()
en tant que variable:
function success(value) {
// compute something from a value...
}
function failure(reason) {
// handle an error...
}
var bar = foo().then(success, failure.bind(this));
Ce que j’ai trouvé très utile, c’est de lier chaque gestionnaire [function] de then()
à un objet vide, afin que chaque fonction puisse y accéder. Ensuite, l'utilisateur peut définir et obtenir les propriétés de chaque mot-clé Promise par this
. Les cadres de tests unitaires fonctionnent de la même manière.
chainPromiseList([getName,getAge],finalDone,rejectHandle);
function chainPromiseList(promiseList,finalDone,errHandle){
var userContext = new UserContext();
if(typeof finalDone==='function') promiseList.Push(finalDone);
if(typeof errHandle==='function') promiseList.Push(errHandle);
return promiseList.reduce((total,curVal,curInd,arr)=>{
var last = curInd+1===arr.length;
var method = last&&typeof errHandle==='function' ? 'catch':'then';
var concatenated = total[method](curVal.bind(userContext));
return concatenated;
},Promise.resolve());
function UserContext(){};
}
function getName(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('got name!');
this.name = 'Paul';
resolve();
},500);
});
}
function getAge(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('got age!');
this.age = 26;
resolve();
},500);
});
}
function finalDone(){
console.log(`Hello, I'm ${this.name} and I'm ${this.age}yo.`);
}
function rejectHandle(msg){
console.log('Error: ',msg);
}