2017-07-13 2 views
0

Ich habe mehrere Beiträge zu diesem Thema gelesen, aber leider mit meiner Situation zu kämpfen.Verschlüsse, Schleifen und Versprechen

Ich ziehe einige URLs aus einem Array von URLs und dann diese Links verwenden, um (sagen wir) den Titel der Seite von diesen Unterwebsites zu erhalten. Am Ende möchte ich eine Liste von Original-URLs und ein Array von Titeln (von den Unterlinks). d. h. in eine Site/Domain gehen, einige Links finden, diese Links locken, um Seitentitel zu finden.

Problem ist, dass mein titleArray nur ein Versprechen und nicht die tatsächlichen Daten zurückgibt. Ich bekomme absolut keine Schließungen und Versprechungen. Der Code wird im aktuellen Knoten ausgeführt. Ich verwende persönliche Websites in meinem echten Code, aber ersetzte häufig verwendete Sites, um ein Beispiel zu zeigen.

const popsicle = require('popsicle'); 

var sites = ['http://www.google.com','http://www.cnn.com']; 

// loop through my sites (here I'm just using google and cnn as a test 
for(var i=0;i<sites.length;i++) { 
    // call function to pull subsites and get titles from them 
    var titleArray = processSites(sites[i]); 

    console.log(sites[i] + ": " + titleArray); 
} 

// get request on site and then get subsites 
function processSites(url) { 
    return popsicle.get(url) 
    .then(function(res) { 
     var data = res.body; 

     // let's assume I get another collection of URLs 
     // that I pull from the main site 
     var subUrls = ['http://www.yahoo.com','http://www.espn.com']; 
     var titleArray = []; 
     for(var j=0;j<subUrls.length;i=j++) { 
     var title = processSubSites(subUrls[j]) 
     titleArray.push(title); 
     } 
     return titleArray; 
    }); 
} 

function processSubSites(url) { 

    return popsicle.get(url) 
    .then(function(res) { 
     var data = res.body; 
     // let's say I pull the title of the site somehow 
     var title = "The Title for " + url; 
     console.log(title); 
     return title; 
    }); 

} 

Das Ergebnis nach diesem Lauf ist:

http://www.google.com: [object Promise] 
http://www.cnn.com: [object Promise] 
The Title for http://www.espn.com 
The Title for http://www.espn.com 
The Title for http://www.yahoo.com 
The Title for http://www.yahoo.com 

während es sein sollte:

http://www.google.com: ['The Title for http://www.yahoo.com', 'The Title for http://www.espn.com'] 
http://www.cnn.com: ['The Title for http://www.yahoo.com', 'The Title for http://www.espn.com'] 
... 
+0

1. Sind yahoo.com und espn.com die SubUrls für die MainUrls? Darf ich Ihnen vorschlagen, Ihre Frage/Ihr Beispiel mit MainUrls und den entsprechenden SubUrls zu modifizieren und dann bitte das tatsächliche/beabsichtigte Ergebnis? 2. Auch ziehen Sie Titel für die SubUrls oder die wichtigsten – Jaya

+0

Was ist die Version von NodeJs, die Sie verwenden. Wenn es etwas> = 7.6 ist, können Sie Async nutzen und warten - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function#Simple_example – codtex

+0

@Jaya - sorry, ich habe hier kein gutes Beispiel genommen. Tatsächlich sind die Haupt-URLs oder Domain-Level und das Sub-System wirklich innerhalb einer Domain. Ich ziehe nur Titel von den SubUrls. –

Antwort

1

Sie nicht normale Daten aus dem Inneren eines Promise zurückkehren kann. Sie müssen einen weiteren Promise zurückgeben, um es verkettbar zu machen. Um mehrere Promise Objekte in einer Schleife zu verarbeiten, müssen Sie sie in ein Array schieben und Promise.all(array) anrufen;

const popsicle = require('popsicle'); 

var sites = ['http://www.google.com','http://www.cnn.com']; 

var titleArrayPromises = []; 
// loop through my sites (here I'm just using google and cnn as a test 
for(var i=0;i<sites.length;i++) { 
    titleArrayPromises.push(processSites(sites[i])); 
} 

var titleArray = []; 
Promise.all(titleArrayPromises).then(function (titleArrays) { 
    for(var i=0; i<titleArrays.length; i++) { 
    titleArray.concat(titleArrays[i]) 
    } 
    // You now have all the titles from your site list in the titleArray 
}) 

function processSites(url) { 
    return popsicle.get(url) 
    .then(function(res) { 
     var data = res.body; 

     // let's assume I get another collection of URLs 
     // that I pull from the main site 
     var subUrls = ['http://www.yahoo.com','http://www.espn.com']; 
     var titlePromiseArray = []; 
     for(var j=0;j<subUrls.length;j++) { 
     titlePromiseArray.push(processSubSites(subUrls[j])); 
     } 
     return Promise.all(titlePromiseArray); 
    }); 
} 

function processSubSites(url) { 
    return popsicle.get(url) 
    .then(function(res) { 
     var data = res.body; 
     // let's say I pull the title of the site somehow 
     var title = "The Title for " + url; 
     return Promise.resolve(title); 
    }); 
} 
+0

Vielen Dank! Das funktioniert und macht Sinn. –