Javascript 将承诺处理程序函数绑定到对象

Javascript 将承诺处理程序函数绑定到对象,javascript,promise,Javascript,Promise,我有一些代码,比如: var bar = foo().then(function success(value) { // compute something from a value... }, function failure(reason) { // handle an error... }); 如何将failure函数绑定到bar上下文中的this对象。我知道我必须使用myFunc.bind(this)但是我应该用什么来代替myFunc?您可以像这样使用bind: 您当前有一个

我有一些代码,比如:

var bar = foo().then(function success(value) {
  // compute something from a value...
}, function failure(reason) {
  // handle an error...
});

如何将
failure
函数绑定到
bar
上下文中的
this
对象。我知道我必须使用
myFunc.bind(this)
但是我应该用什么来代替
myFunc

您可以像这样使用
bind


您当前有一个匿名(尽管有标签)函数用于失败回调:

function failure(reason) {
   // handle an error...
}
正如robertklep所说,您可以立即对该匿名函数调用
.bind
。但是,使用命名函数并将其作为变量传递到
。然后()

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
关键字设置和获取每个承诺中的属性。单元测试框架的工作原理类似

chainPromiseList([getName,getAge],FinalOne,rejectHandle);
功能链promiseList(promiseList、FinalOne、errHandle){
var userContext=new userContext();
if(typeof finalDone=='function')promiseList.push(finalDone);
if(typeof errHandle=='function')promiseList.push(errHandle);
返回承诺列表。减少((总计、曲线、居里、arr)=>{
var last=curInd+1==arr.length;
var method=last&&typeof errHandle==='function'?'catch':'then';
var concatenated=total[method](curVal.bind(userContext));
返回连接;
},Promise.resolve());
函数UserContext(){};
}
函数getName(){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
log('get name!');
this.name='Paul';
解决();
},500);
});
}
函数getAge(){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
console.log('got age!');
这个年龄=26岁;
解决();
},500);
});
}
函数finalDone(){
log(`Hello,我是${this.name},我是${this.age}yo.`);
}
函数拒绝句柄(msg){
log('Error:',msg);

}
如果您只对所包含范围的对象
感兴趣,并且您正在使用ECMA6或更高版本,则可以使用。它看起来像:

var that = this;
var bar = foo().then(value => {
  // compute something from a value...
  console.log(this === that); // true
  this.propA = value.propA
});

你可以在

中找到更多的例子,你在说什么样的本票?ES6JavaScript承诺仍在讨论中是的,我说的是JavaScript承诺。很难相信,ES6JavaScript承诺仍然没有实现。您需要提供更多的上下文@fmsf承诺并不是这里真正重要的部分:)我想你的意思是
失败=失败。绑定(这个)
?@robertklepah,可能是;我不太熟悉
.bind()
。如果它返回一个新对象,而不是原地执行,我想
foo()。然后(success,failure.bind(this))将非常可读。是的,它返回一个新对象:)至于更可读,这是一个有争议的问题;)@罗伯特克莱普:这确实是主观的;但这个问题的提出表明,许多人并不觉得函数文字很容易概念化——他们只是使用匿名回调,因为他们习惯于这样做,并且没有意识到他们正在创建和传递函数对象。@robertklep非常正确。另一方面,您可能希望对多个承诺使用相同的失败回调(但可能会将它绑定到
this
的不同值)。。。这两种方法都有各自的位置,重要的是要意识到它们同样有效
var that = this;
var bar = foo().then(value => {
  // compute something from a value...
  console.log(this === that); // true
  this.propA = value.propA
});