2017-06-15 115 views
0

我正在用ES6编写一些节点代码。在我的代码中,我有一个类,如下所示。请注意,这是一个旨在隔离和显示问题的基本示例。JavaScript - 使用“this”与链接的承诺

class MyClass { 
    constructor() { 
    this.id = uuid(); 
    this.number = Math.floor((Math.random() * 100) + 1); 
    } 

    process() { 
    this.validateNumber() 
     .then(this.generateImage) 
     .catch(function(err) { 
     console.log(err); 
     }) 
    ; 
    } 

    validateNumber() { 
    let self = this; 
    var promise = new Promise(function(resolve, reject) { 
     // do stuff with self.number 
     resolve({}); 
    }); 
    } 

    generateImage() { 
    console.log(this); 
    // the above prints "undefined" in the console window 
    // how do I get this.number again? 

    } 
} 

在这个类中,你会注意到我在我的构造函数中生成一个随机数。我希望这个数字在我班的所有方法中都可以使用。但是,由于我有一个链接在一起的承诺的方法,所以执行validateNumber之后,就像this失去意义。

我该如何解决?

+0

的背景下,我想你的意思是'。然后(this.generateImage)'? – Bergi

+0

不,它失去了它的意思,当你将'generateImage'传递给'then'而没有将它绑定到你的实例。 – Bergi

+0

@Bergi ......你是对的。现在更新。 – user70192

回答

-1

ES6引入了一个称为箭头函数的功能。除了语法比传统的function语法更简洁之外,它保留了这种情况。从本质上讲,你的代码可以更改为以下几点:

var promise = new Promise((resolve, reject) => { 
     console.log(this); // MyClass 
     resolve({}); 
}); 

而且你还需要保留里面的then

this.validateNumber() 
    .then(() => this.generateImage()); 
+0

我建议为我工作的更改 – maddockst

+0

啊,我错过了'()' – maddockst