2016-07-06 1 views
-3

Je voudrais retourner non seulement le résultat de cette promesse mais aussi l'itératif, le url, avec lequel il était appelé. urls est un tableau d'URL.Retour iterable avec Resolve dans 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)) 

quand je fais return {result,url} ne résout pas mais me Redonne l'état actuel de la promesse. Comment est-ce que j'inclurais l'url dans le résultat?

+0

Je gère les promesses du cauchemar du paquet npm et je veux visiter les sites en même temps, d'où les promesses. Je veux inclure l'URL avec laquelle la fonction cauchemar est appelée – warg

+0

Et cela a ... que faire exactement avec le code que vous avez posté? –

+0

Vous devriez vraiment nous montrer votre code actuel, pas un exemple simplifié qui correspond à peine. – Bergi

Répondre

2

Qu'est-ce que vous voulez est

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]})); 
} 

Passer un tableau de tuples à Promise.all bien sûr ne fonctionnera pas, car un tuple n'est pas une promesse et Promise.all n'a aucun moyen de savoir qu'il est censé regarder à l'intérieur du tuple . Au lieu de cela, le code ci-dessus attend que toutes les promesses soient résolues puis mappe les résultats pour vous donner votre tableau de tuples (et renvoie une promesse pour cela).

+0

hmm, ouais ça marcherait Je pensais faire 'return result.then (résultat => {résultat, url})' mais les deux auraient le même résultat –

+0

L'un ou l'autre est OK, le vôtre pourrait être un peu plus propre Note de syntaxe mineure, doit être 'result => ({result, url})'. –

+0

Merci cela a fonctionné :) – warg