在Promise或Callbacks(JavaScript ES6)中处理此问题的正确方法

时间:2018-06-26 01:25:19

标签: javascript class ecmascript-6

处理this的正确或“更好”的方法是带有Promises(甚至回调)的JavaScript类

目前,我只是通过执行此操作来解决

 var self = this;

但这对我来说感觉像是“ hackey”。

忽略下面的大多数代码,这只是为了阐明我的观点。

 class thing {
  drawthing(thing) {
  console.log(thing);	
  }

  updatethings(thing) {
      var self = this;  //a better way to do this
      return new Promise(function (resolve) {
           setTimeout(function(){
               self.drawthing(thing);
               return resolve(thing);
           },2000);
      });
  }
}

var t = new thing();
t.updatethings('hello').then(console.log);

3 个答案:

答案 0 :(得分:1)

箭头功能将为您完成此任务。 请查看一些说明和examples here

以下是正确的代码段:

class thing {
  drawthing(thing) {
      console.log(thing);   
  }

  updatethings(thing) {
          // arrow func
          return new Promise((resolve) => {
               // another arrow func
               setTimeout(() => {
                   // Because of arrow function scoping, `this` passes through.
                   this.drawthing(thing);
                   return resolve(thing);
               },2000);
          });
      }
}

var t = new thing();
t.updatethings('hello').then(console.log);

答案 1 :(得分:1)

尝试使用lambda / arrow函数:

template<typename U>
MyClass<U>& operator +=(MyClass<U>& lhs, const U& rhs)
{
  lhs.val += rhs;
  return lhs;
}

答案 2 :(得分:0)

如果您的方法drawthing()将引发任何异常或错误,则您的诺言将永远无法解决,最终将引发异常。

您还应该在出现异常情况时处理拒收案件,例如

<div class="wrapper">
<mat-sidenav-container>

        <div>
            <app-mat-menu></app-mat-menu>            
            <router-outlet></router-outlet>
            <app-footer></app-footer>
        </div>
</mat-sidenav-container>
</div>

在调用方法时,您还应该捕获异常。

 updatethings(thing) {
      var self = this;  //a better way to do this
      return new Promise((resolve, reject)=>{
           setTimeout(()=>{
              try{
                self.drawthing(thing);

              }catch(err){ return reject(err);}

              return resolve(thing);

           },2000);
      });
  }