2016-04-06 7 views
4

Eingang: eine Anordnung von Benutzernamen strings

benötigt Ausgang: ein Array von JavaScript-Objekte, die jedem Benutzernamen in die entsprechen Eingang. Die Eigenschaften für diese JS-Objekte müssen aus zwei API-Aufrufen für jeden Benutzernamen bestehen (Ich verwende $.getJSON Aufrufe. Vorschläge willkommen).

Ich habe ein Array von Benutzernamen für die Twitch API:

let users = ["OgamingSC2", "storbeck", "comster404"] // actual list is longer 

Ich möchte die Array.prototype.map() Funktion höherer Ordnung verwenden, um ein Array von Objekten wie

let userObjects = [ {...}, {...}, {...}, ... ] 

zu schaffen, in dem jedes Objekt aussieht :

{ 
username: 'storbeck' // <-- Added by me 
stream: null,   // <-- Added by first API call 
_links: {    // <-- Added by first API call 
    self:'https://api.twitch.tv/kraken/streams/storbeck', 
    channel:'https://api.twitch.tv/kraken/channels/storbeck' 
} 
logo: 'http:// ... png' // <-- Added by second API call 
} 

Dies sind die zwei API-Aufruffunktionen, die r eturn die $.getJSON Versprechungen:

let getStreamInfo = (username) => { 
    return $.getJSON('https://api.twitch.tv/kraken/streams/'+username+'?callback=?') 
    .then((x) => x) // should I include this then? 
} 

let getUserInfo = (twitchObject) => { 
    return $.getJSON('https://api.twitch.tv/kraken/users/'+ twitchObject.user) 
} 

Was ich in meinem Code so weit haben, die in den beabsichtigten Ziele nicht ist resultierende:

let userObjects = users.map((user)=>{ 
    return getStreamInfo(user) 
    .done((data) => { 
     let result = { 
     username: user, 
     data: data 
     } 
     console.log(JSON.stringify(result)) // prints out the intended object so far 
     return result 
    }) 
}) 

Nun, wenn ich den Inhalt userObjects ausdrucken, I erhalten:

"{}" 
"{}" 
"{}" 
// ... and so on 

weiter gehen, ich Kette möchte userObjects und mehr in jedem JS-Objekt aus, was auch immer ich in der getUserInfo bekommen Funktion.

Ich möchte gehen, wie dies mit funktionalem Javascript getan werden kann, aber das ist nicht notwendig.

+0

Sie eine 'promise' von Ihrem' users.map Rückkehr ((Benutzer)) 'Ruf, nicht das Objekt, das das Ergebnis ist von der (später) entsprechende Ajax-Ruf. Führen Sie zuerst eine Standard/Basis-Map aus dem Array zu den Objekten aus, dann führen Sie sie in Verspre- chen/Ajax-Aufrufe aus, um das Objekt zu füllen. –

Antwort

0

Sie sind auf dem richtigen Weg, Sie brauchen nur kleine Änderungen an Ihren Funktionen.

let getStreamInfo = (username) => { 
    return $.getJSON('https://api.twitch.tv/kraken/streams/'+username+'?callback=?'); 
} 

let getUserInfo = (user) => { 
    return $.getJSON('https://api.twitch.tv/kraken/users/'+ user); 
} 

let userObjects = []; 

Die Kernfunktion benötigt statt Versprechen Synchronisation:

users.map((user)=>{ 

    Promise.all(getStreamInfo(user), getUserInfo(user)).then((data)=>{ 
    let obj = { 
     username: user, 
     stream: data[0].stream, 
     _links: data[0]._links, 
     logo: data[1].logo 
    } 
    userObjects.push(obj); 
    }); 
});