2017-06-14 76 views
1

我有以下問題。Resolving Promise Angular 2

在函數中我有一個承諾作爲返回類型。該功能位於類層次結構中。

updateNodeValues(entity: String, data: {}): Promise<any>{ 
    let jsonBody = JSON.stringify(data); 
    let url = environment.endpointCore + '/api/' + entity + '/' + data['id']; 

    return this.http.put(url, jsonBody, this.options) 
     .toPromise() 
     .then(response => { 
     return response; 
     }) 
     .catch(this.handleError); 
    } 

此函數在類節點中。

onSubmit(): void{ 
    var currentForm = this.form.value; 
    var entityName = this.inflection.classify(this.node.type).toLowerCase(); 
    var requiredData = {}; 

    for(var i = 0; i < this.formItems.length; i++){ 
     this.formItems[i].value = currentForm[Object.keys(currentForm)[i]]; 
    } 

    for(var i=0; i<this.formItems.length; i++){ 
     requiredData[this.globalService.camelize(this.formItems[i].label)] = this.formItems[i].value 
    } 

    Promise.resolve(this.hierarchyService.updateNodeValues(entityName, requiredData)).then(response => { 
     alert(response.ok); 
     if(response.ok){ 
     this.globalService.showSuccessMessage('Values updated'); 
     this.refreshGui(requiredData); 
     } 
    }); 
    this.editMode = false; 
    } 

的問題是,當我試圖解決的承諾,並調用this.refreshGui(requireddata)什麼也沒有發生。我已經閱讀了關於脂肪箭頭如何保留這個「上下文」,我不明白爲什麼調用這個方法沒有做任何事情,而調用successMessage產生預期的結果。

我調用的方法如下所示,它也在類節點中。

private refreshGui(data: {}){ 
    this._node.data = data; 
    this.objectProperties = new Array(); 
    this.nodeChildren = new Array(); 
    for (var property in data) { 
     var propertyValue = data[property]; 
     if (propertyValue instanceof Array) { 
     this.nodeChildren.push({label: property, value: "total: ".concat(propertyValue.length.toString())}); 
     } else { 
     this.objectProperties.push({label: property, value: propertyValue}); 
     } 
    } 
    } 

回答

0

我發現工作的解決方案是實現自定義事件。問題是在異步回調分辨率內,this會「迷路」。胖箭頭使我能夠用這個方法調用類方法,但是其中的屬性會「丟失」。由於這個原因,我從方法中取出邏輯,並將其放入回調部分,並在某些變量中設置預期和需要的結果。這個變量被傳遞給我的自定義事件,並在自定義事件處理程序中適當地設置爲類變量。