ES6和诺言中的可变范围 [英] ES6 and variable scope inside a promise

查看:89
本文介绍了ES6和诺言中的可变范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

不确定我在这里缺少什么.

Not sure what I'm missing here.

我需要将data的输出转换为this.contact.现在,我正在使用静态类变量,但必须这样做似乎很肮脏.

I need to get the output of data into this.contact. Right now, I'm using a static class variable, but it seems dirty to have to do that.

export class contactEdit {
  static t; // static class var
  constructor() {
    this.id = null;
    this.contact = null;
    contactEdit.t = this;
  }

  activate(id) {
    this.id = id;
    let contact = this.contact; // scoped version of class var
    return dpd.contacts.get(id).then(function(data) {
      console.log(data);
      contactEdit.t.contact = data; // this works
      contact = data; // this doesn't
    });
  }
}

通常我会在activate()函数内创建一个var contact(它在Chrome控制台中有效),但这似乎在ES6中不起作用.

Normally I would create a var contact inside the activate() function (it works in the Chrome console) but this doesn't seem to working in ES6.

Chrome控制台:

Chrome console:

var c = null;
undefined
c;
null
dpd.contacts.get('a415fdc8f5a7184d').then(function(data) {
      c = data;
    });
Object {}fail: (n)then: (e,t)__proto__: Object
c;
Object {firstName: "John", lastName: "Doe", id: "a415fdc8f5a7184d"}

推荐答案

您需要做两件事.首先,使用箭头功能,其次,使用`this.contact = data;

You need to do two things. First, use an arrow function, and second, use `this.contact = data;

activate(id) {
  this.id = id;
  return dpd.contacts.get(id).then(data => {
    console.log(data);
    this.contact = data;
  });
}

您使用箭头函数是因为它处理JavaScript的"this"问题,该问题指的是函数的词法范围,而不是您当前所在的对象.使用箭头函数可确保与箭头功能内的this相同.

You use an arrow function because it deals with JavaScript's "this" issue, where this refers to the lexical scope of the function, and not the object you're currently in. Using an arrow function makes sure that this outside the arrow function is the same as this inside the arrow function.

您需要使用this.contact,因为contact是该类的实例属性.

You need to use this.contact because contact is an instance property of the class.

这篇关于ES6和诺言中的可变范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆