2016-05-13 14 views
0

Ich habe eine Aurelia Web App, die einen Künstler nach Namen sucht und dann alle Kunstwerke vom Künstler zurückgibt. Die json vom Künstler Suche ergab sieht wie folgt aus:Aurelia - Kombinieren Sie Json aus zwei API-Calls zu einem

{ 
"source": "Museum", 
"language": "EN", 
"resultsCount": 1, 
"objects": [ 
    { 
    "objectNumber": "125.1988", 
    "objectID": 981, 
    "title": "Governor's Palace (Raj Bhaven) project, Chandigarh, India", 
    "displayName": "Le Corbusier (Charles-Édouard Jeanneret)", 
    "alphaSort": "Le Corbusier (Charles-Édouard Jeanneret)", 
    "artistID": 3426, 
    "displayDate": "French, born Switzerland. 1887–1965", 
    "dated": "1951–1976", 
    "dateBegin": 1951, 
    "dateEnd": 1976, 
    "medium": "Wood, cardboard, and plexiglass", 
    "dimensions": "33 x 71 1/4 x 65\" (83.8 x 181 x 165.1 cm)", 
    "department": "Architecture & Design", 
    "classification": "A&D Architectural Model", 
    "onView": 0, 
    "provenance": "", 

    etc.... 

Der vollständige json hier:

https://github.com/smoore4moma/tms-api/blob/master/object.json

Das Problem, das ich habe, ist, dass der Künstler suchen mehrere Künstler mit dem ähnlichen zurückkehren Namen ("Serra" zum Beispiel gibt Richard Serra und Daniel Serra-Badué zurück). Also kann ich die Suche wiederholen und die API zweimal aufrufen, um die Kunstwerke zu bekommen, aber ich habe keine Möglichkeit gefunden, die zwei verschiedenen API-Aufrufe zu kombinieren, jedenfalls nicht mit Aurelia. Hier ist ein Codeausschnitt von dem, was ich versuche zu tun. Ich habe versucht jQuery, .Extend, .Concat, .Push, Erstellen von Arrays, Wörterbuch .... Ich bin nur stecken.

getByConstituentId(id) { 
    return this.http.fetch(baseUrl + "/artists/" + id + token) 
    .then(response => response.json()) 
    .then(response => { 
     return response.objects; 
    }); 
    } 

// This is not the actual looping code. But the idea is to combine these two function calls into one result and return that. 

    getBySearchTerms(searchCreator) { 

    let obj0 = this.getByConstituentId(5350); 
    let obj1 = this.getByConstituentId(5349); 

    return ??? // This is where I am looking for help. 
       // just for ex. "return this.getByConstituentId(5349);" 
       // works just fine 

    } 

Irgendwelche Ratschläge, wie man das macht? Ansonsten werde ich eine API-Methode erstellen, die ein Array von Interpreten-IDs verwendet, aber ich würde lieber einfache API-Methoden verwenden und json dort kombinieren, wo sie benötigt werden. Vielen Dank.

FOLLOW-UP

@Tomalak Beratung Dies ist nach schließlich, was funktioniert hat:

return Promise.all([ 
    this.getByConstituentId(5349), 
    this.getByConstituentId(5350)]) 
    .then(response => { 

    return response[0].concat(response[1]); 

    }); 
+0

Bitte keine Screenshots des Codes, die keinen Sinn machen. – Tomalak

+0

Ich sehe ständig Kommentare darüber, dass keine URLs gepostet werden, weil es sich irgendwann in einen toten Link verwandeln könnte ... also was ist es? – smoore4

+0

Postleitzahl als Text, offensichtlich. – Tomalak

Antwort

2

die Promise.all() function See.

[...] gibt eine Zusage zurück, die sich löst, wenn alle Versprechen im iterablen Argument aufgelöst wurden oder mit dem Grund der ersten abgelehnten Zusage abgelehnt werden.

function getByConstituentId(id) { 
    return this.http.fetch(baseUrl + "/artists/" + id + token) 
    .then(response => response.json().objects); 
}; 

function getBySearchTerms(searchCreator) { 
    return Promise.all([ 
     this.getByConstituentId(5350), 
     this.getByConstituentId(5349) 
    ]); 
} 

Wenn jQuery tatsächlich tut Ihre Ajax-Aufrufe (das heißt, wenn this.http.fetch ein Wrapper um $.ajax) Sie können die jQuery jquery.when(), die den gleichen Zweck erfüllt, sondern macht Sie unabhängig von the browser's native support for the Promise API.

function getBySearchTerms(searchCreator) { 
    return $.when(
     this.getByConstituentId(5350), 
     this.getByConstituentId(5349) 
    ); 
} 

Beachten Sie die unterschiedlichen Anrufkonventionen. $.when erwartet eine Argumentliste, während Promise.all() eine iterierbare (wie ein Array) erwartet.

Sie können $.when mit einem Array-Argument durch .apply() verwenden.

function getBySearchTerms(searchCreator) { 
    return $.when.apply($, [ 
     this.getByConstituentId(5350), 
     this.getByConstituentId(5349) 
    ]); 
} 
+0

Das sieht sehr "vielversprechend" aus. Jetzt testen und keinen Fehler bekommen, aber auch kein erwartetes Ergebnis. Werde bei Ihnen bald wieder melden. – smoore4

+1

'getBySearchTerms' gibt ein anderes Versprechen zurück. Verwenden Sie den Rückgabewert entsprechend. – Tomalak

Verwandte Themen