2017-06-14 2 views
1

Ich habe einen Anbieter, der mir erlauben sollte, bestimmte Daten von einer API, die ich brauche zurückgeben. Ich habe diese Funktion, die es tut:Rückgabe von Daten von Provider Versprechen Funktion in Javascript

public getStoryCount(key: string, val: number) { 
    return this.client.getEntries({ 
     'content_type': xxxxxxxxxxxxxx, 
     [key]: val, 
    }).then((entries:any) => { 
     return entries.total; 
    }); 
} 

Dies ist mein erstes Mal wirklich Versprechen, aber ich bin versucht, dies in einer Komponente rufen Sie den Wert zu erhalten. Ich möchte in der Lage sein, den Wert entries.total zu bekommen, wenn ich console.log ausgegeben bekomme.

Ich baue eine Reihe von Daten aus wie so in meiner Ansicht zu verwenden:

this.homeScreen.push({ 
    'count': Provider.getStoryCount('sys.id', xxxx) 
}); 

Wenn ich die Provider-Funktion console.log kann ich den Wert in dem Versprechen sehen, und es sieht wie folgt aus:

__zone_symbol__state : true 
__zone_symbol__value : 13 // this is the value I need to get 

Wie kann ich diese Nummer 13 auf meinem Array homeScreen ['count'] Wert ?? Oder was mache ich falsch?

Antwort

0

Es ist eine asynchrone Operation. Sie müssen eine Funktion in then passieren:

Provider.getStoryCount('sys.id', xxxx) 
    .then((total) => { 
    this.homeScreen.push({ 
    'count': total 
    }); 
    }); 
1

Sie derzeit die Promise und nicht der tatsächliche Wert zurückkehrt. Das bedeutet, dass Sie Ihren Komponentencode folgendermaßen ändern müssen:

Provider.getStoryCount('sys.id', xxxx) 
    .then((entries:any) => { 
     this.homeScreen.push({ 
      'count': entries.total 
     }); 
    } 
}); 

sollte funktionieren.

Sie könnten auch Ihren Provider Service den Wert erhalten und speichern Sie es als Observable, so dass Komponenten können dann den Wert abonnieren.

0

Verwenden Sie zuerst map, um das Ergebnis des Versprechens einem anderen Wert zuzuordnen.

public getStoryCount(key: string, val: number) { 
    return this.client.getEntries({ 
     'content_type': xxxxxxxxxxxxxx, 
     [key]: val, 
    }).map((entries:any) => { 
     return entries.total; 
    }); 
} 

dann beim Aufruf der Versprechen der Rückkehr Funktion nutzen then das Ergebnis zu erhalten

Provider.getStoryCount('sys.id', xxxx).then((total) => ...use total...); 
1

Da Versprechen asynchron sind, sind Sie eigentlich nicht zurückkehren entries.total wie Sie vielleicht denken.

Sie müssen wahrscheinlich Ihre eigene Callback-Funktion bereitstellen oder einfach das Versprechen (generiert von this.client.getEntries) zurückgeben und eine then an das Ergebnis kleben. Es könnte in etwa so aussehen:

public getStoryCount(key: string, val: number) { 
    return this.client.getEntries({ 
     'content_type': xxxxxxxxxxxxxx, 
     [key]: val, 
    }); 
    // The 'then' will be added later 
} 

// ... 

// Get the promise from the provider, and invoke 'then' here. 
var storyCountPromise = Provider.getStoryCount('sys.id', xxxx); 
storyCountPromise.then((entries:any) => { 
    this.homeScreen.push({ 
     'count': entries.total 
    }); 
}); 
Verwandte Themen