2016-11-17 9 views
5

Mam funkcję w ramach usługi Angular2, która zwraca dane próbne za pośrednictwem Promise.resolve, która po rozpakowaniu z .then daje mi pusty obiekt obietnicy. Widzę, że funkcja wywołująca odbiera Promise z ładunkiem w obiekcie __zone_symbole__value zanim zostanie przekazany do .then however inside of .Następnie I seem to be left with just an empty promise.Skrypt maszynowy obiecuje utratę wartości po .then

getTemperatureData(): Promise<any> { 

    let data = this.convertJSONToGoogleChartTable(temperatureData_JSON); 
    let p = Promise.resolve(data); 
    return p; 
    } 

Korzystanie Chrome widzę, że p powyżej wygląda

ZoneAwarePromise {__zone_symbol__state: true, __zone_symbol__value: "[["Date","Temperature","LowTemperature"],["05/11/2…",69.02,null],["06/11/2016 23:54:34",69.99,null]]"}

Kod wywołujący, który jest podzielony na dwie linie do debugowania, znajduje się poniżej.

getTemperatureData() { 
    var d = this.dataService.getTemperatureData(); 
    d.then(data => this.line_ChartData = data); 
} 

Kiedy patrzę na d widzę tak samo jak p powyżej

ZoneAwarePromise {__zone_symbol__state: true, __zone_symbol__value: "[["Date","Temperature","LowTemperature"],["05/11/2…",69.02,null],["06/11/2016 23:54:34",69.99,null]]"}

problem występuje z .then gdzie wartość „d” jest po prostu pusta obietnica. Poniższy fragment został zaczerpnięty z konsoli narzędzi Chrome, by pokazać, co widzę.

d.then(data => console.log(data)) 
ZoneAwarePromise {__zone_symbol__state: null, __zone_symbol__value: Array[0]} 

Bez względu na to, co robię i ile kombinacji próbowałem, nie mogę uzyskać danych wewnątrz d. (Zauważmy, że p i d są tylko tymczasowe złamać kod w dół do teraz).

Moja package.json jest poniżej:

{ 
    "name": "angular2", 
    "version": "0.0.0", 
    "license": "MIT", 

    "angular-cli": {}, 
    "scripts": { 
    "start": "ng serve", 
    "lint": "tslint \"src/**/*.ts\"", 
    "test": "ng test", 
    "pree2e": "webdriver-manager update", 
    "e2e": "protractor" 
    }, 
    "private": true, 
    "dependencies": { 
    "@angular/common": "~2.1.0", 
    "@angular/compiler": "~2.1.0", 
    "@angular/core": "~2.1.0", 
    "@angular/forms": "~2.1.0", 
    "@angular/http": "~2.1.0", 
    "@angular/material": "^2.0.0-alpha.9-3", 
    "@angular/platform-browser": "~2.1.0", 
    "@angular/platform-browser-dynamic": "~2.1.0", 
    "@angular/router": "~3.1.0", 
    "core-js": "^2.4.1", 
    "ng2-bootstrap": "^1.1.16", 
    "node-mysql": "^0.4.2", 
    "rxjs": "5.0.0-beta.12", 
    "ts-helpers": "^1.1.1", 
    "zone.js": "^0.6.23" 
    }, 
    "devDependencies": { 
    "@types/jasmine": "^2.2.30", 
    "@types/node": "^6.0.42", 
    "angular-cli": "1.0.0-beta.19-3", 
    "codelyzer": "1.0.0-beta.1", 
    "jasmine-core": "2.4.1", 
    "jasmine-spec-reporter": "2.5.0", 
    "karma": "1.2.0", 
    "karma-chrome-launcher": "^2.0.0", 
    "karma-cli": "^1.0.1", 
    "karma-jasmine": "^1.0.2", 
    "karma-remap-istanbul": "^0.2.1", 
    "protractor": "4.0.9", 
    "ts-node": "1.2.1", 
    "tslint": "3.13.0", 
    "typescript": "~2.0.3", 
    "webdriver-manager": "10.2.5" 
    } 
} 
+1

'let p = Promise.resolve (data);' to jest dziwne. Obietnica jest asynchroniczna, więc jeśli spodziewasz się uzyskać wynik tej obietnicy, to nie jest tak, jak działa. – Maxime

+0

Pokaż nam cały kod. Co robisz z 'this.line_ChartData'? Czy może gdzieś go opróżniasz? Zauważ, że odnosi się do tej samej tablicy, która również jest zawarta w obietnicy. Wypróbuj 'this.line_ChartData = data.slice()' zamiast tego – Bergi

Odpowiedz

1

wartość danych jest tylko pusta obietnica

To mówi mi, że convertJSONToGoogleChartTable zwraca obietnicę, a ty nie spętasz swojej obietnicy.

Pamiętaj, że jeśli używasz silniejszego typu niż any, prawdopodobnie kompilator TypeScript złapie to za Ciebie.

Ponieważ nie robią nic po uzyskaniu tych danych, można po prostu to zrobić:

getTemperatureData(): Promise<any> { 
    return this.convertJSONToGoogleChartTable(temperatureData_JSON); 
    } 

Ale jeśli chcesz coś zrobić z tymi danymi przed wpuszczeniem go, można to zrobić w sposób then , przykuty oryginalną obietnicą:

+0

Dziękujemy za odpowiedź. Funkcja convertJSONToGoogleChartTable zwraca tylko ciąg będący konwersją surowego JSON. Wszystko to należy do klasy usług Angular2, której używam do pobierania i formatowania danych. – JSeatter

+0

Dziękuję za odpowiedź. Funkcja convertJSONToGoogleChartTable zwraca tylko ciąg będący konwersją surowego JSON. Wszystko to należy do klasy usług Angular2, której używam do pobierania i formatowania danych. Dane acuially wyglądają jak "dane " [["Data", "Temperatura", "Niska temperatura"], ["05/11/2016 00:14:23", 72,44, null], ["05/11/2016 00:44:31 ", 71,46, null], [" 05/11/2016 01:14:39 ", 70,48, null], ....]]]" ' To wraca do dzwoniącego w porządku, w moim przypadku to "d" w komponencie Angular2. Gdzie jest źle dla mnie wyodrębnia powyższy ciąg z d. – JSeatter

+0

@JSeatter: Co się stanie, jeśli wejdziesz do konsoli: 'Promise.resolve (2) .then (console.log)'? Co się stanie, jeśli wstawisz 'console.log (dane)' po wywołaniu 'convertJSONToGoogleChartTable'? – StriplingWarrior

Powiązane problemy