2016-07-26 103 views
2

不知道我在這裏失蹤。ES6和承諾內的變量範圍

我需要得到data的輸出爲this.contact。現在,我正在使用一個靜態類變量,但它似乎很髒,必須這樣做。

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 
    }); 
    } 
} 

通常我會創造一個var contactactivate()功能(它適用於Chrome控制檯)內,但這個似乎並沒有在ES6工作確實。

Chrome的控制檯:

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"} 
+1

你沒只想'this.contact =數據;',而不是'接觸=數據;'? – trincot

+0

'static t;'不是ES6。你使用打字稿還是什麼? – Bergi

+2

無論如何,您都不應該將承諾結果存儲爲實例屬性。如果需要,請保存承諾。 – Bergi

回答

13

你需要做兩件事情。首先,使用箭頭函數,其次,使用`this.contact = data;

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

你用一個箭頭的功能,因爲它使用JavaScript的「this」的問題,在此指的是功能的詞彙範圍,而不是目前在你的對象的交易。使用箭頭功能可確保this以外的箭頭功能與this裏面的箭頭功能相同。

您需要使用this.contact,因爲contact是該類的實例屬性。

+1

今天所有堆棧溢出的最佳答案 –

+0

@MatthewJamesDavis我同意,箭頭函數的伎倆。 –

+0

@AshleyGrant,也許你可以添加一兩句話來說明爲什麼箭頭函數修復了這個問題?我要去讀這篇文章,但是我確信會幫助其他人。 –

2

問題是contact = data;將更新本地contact變量的值,但不會更改this.contact的值。 您需要改爲更新contact聯繫人屬性。問題在於你不能訪問函數內核中的this

有不同的方法來解決這個問題。

1您可以保存激活的情況下(this)爲變量的activate關閉,這樣就可以訪問它的then內線核心。

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

2 - 可以綁定功能this這樣你就可以訪問它。

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

3-(建議使用ES6),你可以用一個箭頭功能(箭頭功能保存上下文)

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

我已經嘗試#1沒有運氣。去試試#2,看看它是如何工作的。 #3作品。 –

+0

#1和#2也可以工作。我的錯誤是使用'let contact = this.contact'。顯然這不會工作,因爲'let that = this' does not work。奇怪,但我會接受。 –

+0

這並不奇怪。如果你做'contact = something',你正在爲'contact' **變量賦值一個新值。您不修改分配給它的以前的值。你要做的是改變'this'對象的'contact'屬性。這個屬性與'contact'變量無關(除了你將它的值初始化爲'this.contact'指向的值)。改變對象'obj'屬性'prop'所指的值的唯一方法就是寫一些類似於'obj.prop = something'的東西。 –