2017-08-26 4 views
1

Der folgende Ausschnitt gibt undefined anstelle eines erwarteten Arrays von Verknüpfungen zurück. apiCall() ist von here.Zurückgeben eines Werts in einer Funktion einer Funktion

Ist es möglich, das Array zurückzugeben? Wenn das so ist, wie? Wenn nicht warum?

async function fetchData() { 

    await apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}', 
     (error, response, body) => { 
     return JSON.parse(body).items.map(i => 'https://www.youtube.com/watch?v=' + i.id.videoId) 

      }) 

} 
    fetchData().then(r => console.log(r)) 

EDIT: Der folgende Code scheint zu funktionieren;

async function fetchData(param, fn) { 

    await apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}', 
     (error, response, body) => { 
     fn(JSON.parse(body).items.map(i => 'https://www.youtube.com/watch?v=' + i.id.videoId)) 

      }) 

} 
fetchData('lee', function(Ar) { console.log(Ar) }) 

}; 

Kann jemand darauf hinweisen, warum?

+0

_Wenn nicht warum? _ - 'apiCall' gibt kein Versprechen, nicht wahr? – Federkun

+0

Diese Funktion Rückgabe ist nicht sync, gibt es kein Versprechen, – Remario

+0

näher Analyse zeigt, dass eine Maped-Werte zurückgeben, die kein Versprechen Schnittstelle ist. – Remario

Antwort

0

await auf verwendet warten auf eine Versprechen. apiCall ist nicht eins, es verwendet die Continuation-Passing-Style-Konvention. Also, man muss nur ein neues Versprechen lösen, wenn die apiCall ‚s Rückruf aufgerufen wird:

async function fetchData() { 
    return await new Promise((resolve) => { 
     apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}', (error, response, body) => { 
      // resolve the promise here 
      resolve(JSON.parse(body).items.map(i => 'https://www.youtube.com/watch?v=' + i.id.videoId)) 
     }) 
    }); 
} 
+0

mit async und erwarten sollte die Notwendigkeit für explizite Versprechen zu beseitigen, gute Lösung, aber es trotzt das Konzept von aync/warten – Remario

+0

Was meinst du? async/await sind auf Generatoren und Versprechungen aufgebaut: Sie können sie nicht ohne Versprechen nutzen. Da 'apiCall' kein Versprechen ist, müssen Sie es" promistifizieren ". – Federkun

+0

Frage, wenn Sie ausdrücklich Versprechungen verwenden, warum warten Sie es mit einem Async, wenn Sie es wiedererlangen, was ist der Haken, das ist überflüssig richtig. Das Entfernen der Async- und Abwarten-Schlüsselwörter sollte keinen Unterschied ergeben. – Remario

0

Änderung:

async function fetchData() { 

    await apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}', 
     (error, response, body) => { 
     return JSON.parse(body).items.map(i => 'https://www.youtube.com/watch?v=' + i.id.videoId) 

      }) 

} 

zu:

async function fetchData() { 

    return await apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}'); 

} 

try Versprechen Ausführung hier:

fetchData().then(r => console.log(r)) 
+0

dann auf r tun, JSON.parse (r) .items.map (i => https://www.youtube.com/watch?v= '+ i.id.videoId) – Remario

Verwandte Themen