Ответ 1
Вы можете использовать bind
следующим образом:
var bar = foo().then(function success(value) {
// compute something from a value...
}, function failure(reason) {
// handle an error...
}.bind(this));
У меня есть код вроде:
var bar = foo().then(function success(value) {
// compute something from a value...
}, function failure(reason) {
// handle an error...
});
Как связать функцию failure
с объектом this
в контексте bar
. Я знаю, что мне придется использовать myFunc.bind(this)
, но что я вместо вместо myFunc
?
Вы можете использовать bind
следующим образом:
var bar = foo().then(function success(value) {
// compute something from a value...
}, function failure(reason) {
// handle an error...
}.bind(this));
В настоящее время у вас есть анонимная (хотя и помеченная) функция для обратного вызова отказа:
function failure(reason) {
// handle an error...
}
Как говорит robertklep, вы можете сразу вызвать .bind
эту анонимную функцию. Однако может быть более читаемым использовать именованную функцию вместо этого и передать ее в .then()
как переменную:
function success(value) {
// compute something from a value...
}
function failure(reason) {
// handle an error...
}
var bar = foo().then(success, failure.bind(this));
Мне было очень полезно связать каждый обработчик then()
[function] с одним пустым объектом, поэтому каждая функция может иметь к нему доступ. Затем пользователь может установить и получить свойства в каждом обещании с помощью ключевого слова this
. Рамки unit test работают аналогично.
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);
}