2017-06-14 9 views
1

次の問題があります。プロミス角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のコンテキストが「失われる」というコンテキストでした。太い矢はこれでクラスメソッドを呼び出すことができましたが、その中のプロパティは "失われています"。この理由から私はメソッドからロジックを取り出し、それをコールバックの部分に置き、期待され、必要な結果を変数にセットしました。この変数はカスタムイベントに渡され、カスタムイベントハンドラのクラス変数に適切に設定されています。

関連する問題