2016-07-06 10 views
-3

Ich möchte nicht nur das Ergebnis dieses Versprechens aber auch das iterable, das url, mit dem es genannt wurde, zurückgeben. urls ist ein Array von URLs.Return iterable mit Resolve in Promise.all

function findMainLink(urls) { 
    return Promise.all(urls.map((url) => { 
    var result = nightmare 
    .goto(url) 
    .wait('#main') 
    .evaluate(function() { 
     return document.querySelector('#main a').href; 
    }); 

    nightmare.end() 
    return result 
    } 
} 

vo(findMainLink)([ 
'https://yahoo.com', 
'https://google.com' 
]) 
.then(res => console.log(res)) 
.catch(e => console.error(e)) 

wenn ich return {result,url} es löst nicht, sondern gibt mir den aktuellen Status der Zusage zurück. Wie würde ich die URL in das Ergebnis aufnehmen?

+0

Ich handle Versprechungen aus dem NPM-Paket Alptraum und möchte gleichzeitig Webseiten besuchen, daher die Versprechen. Ich möchte die URL hinzufügen, mit der die Albtraumfunktion aufgerufen wird – warg

+0

Und das hat ... was genau mit dem Code zu tun, den Sie geschrieben haben? –

+0

Sie sollten uns Ihren tatsächlichen Code zeigen, nicht ein vereinfachtes Beispiel, das kaum dazu passt. – Bergi

Antwort

2

Was Sie wollen, ist

function findMainLink(urls) { 
    return Promise.all(urls.map((url) => { 
    var result = nightmare 
     .goto(url) 
     .wait('#main') 
     .evaluate(function() { 
     return document.querySelector('#main a').href; 
     }); 

    nightmare.end(); 
    return result; 
    }) 
    .then(results => results.map((result, i) => ({result, url[i]})); 
} 

eine Reihe von Tupeln Promise.all natürlich Passing wird nicht funktionieren, da ein Tupel kein Versprechen ist und Promise.all hat keine Möglichkeit, es soll wissen, innerhalb der tuple aussehen . Stattdessen wartet der obige Code auf alle zu lösenden Versprechen und ordnet dann die Ergebnisse zu, um Ihnen Ihr Array von Tupeln zu geben (und gibt ein Versprechen dafür zurück).

+0

hmm, yeah das würde funktionieren Ich dachte ich mache 'result.then (result => {result, url}) 'aber beide hätten Das gleiche Ergebnis –

+0

Entweder ist OK, Ihr könnte ein bisschen sauberer sein.Minor Syntax Hinweis, muss sein, Ergebnis => ({Ergebnis, URL}) '. –

+0

Danke funktioniert :) – warg