2017-12-12 3 views
1

In meiner Node.js-Anwendung habe ich eine Funktion, die eine Reihe von URLs durchläuft und ihre Werte abruft. Sobald die Schleife abgeschlossen ist, wird der endgültige Wert als Map zurückgegeben. Code folgt.Warten auf das Versprechen der Funktion in JavaScript

let getResults = function(urls){ 
    let results = new Map(); 
    let retrievePromises = []; 
    urls.forEach(function (value, i) { 
     retrievePromises.push(
      restAgent.get(value).then(function(data){ 
       for (let item of data.items) { 
        let name = item.filter(n => n.name === "somename"); //filter array 
        let obj = {}; 
        obj.name = item.name; 
        obj.address = item.address; 
        results.set(name, obj); 
       } 

      }).catch(function(err){ 
       console.log(err); 
      }) 
     ); 
    }); 

    Promise.all(retrievePromises).then(function(){ 
     return this.results; 
    }); 
} 

Wenn dann laufe ich, wird es console.log(getResults()); zurückkehren undefined wie vor die Funktion zurückkehrt Ergebnisse ausgelöst wird. Wie man dieses Problem zu lösen, und seit ich neu zu Promises bin, irgendwelche möglichen Verbesserungen des Codes? (Ich weiß, dass forEach ist nicht günstig)

Antwort

2

Sie müssen die Promise zurückgeben. In Ihrem Fall haben Sie die return Promise.all

let getResults = function(urls){ 
    let results = new Map(); 
    let retrievePromises = []; 
    urls.forEach(function (value, i) { 
     retrievePromises.push(
      restAgent.get(value).then(function(data){ 
       for (let item of data.items) { 
        let name = item.filter(n => n.name === "somename"); //filter array 
        let obj = {}; 
        obj.name = item.name; 
        obj.address = item.address; 
        results.set(name, obj); 
       } 

      }).catch(function(err){ 
       console.log(err); 
      }) 
     ); 
    }); 

    return Promise.all(retrievePromises).then(function(){ 
     return results; 
    }); 
} 

Es Verbesserungs keine Notwendigkeit, ist, dass Sie Code Code optimal zurückkehren. Gut gemacht!

Um die Ergebnisse zu überprüfen, müssen Sie tun, wenn Sie getResults() aufrufen. Wenn Sie console.log(getResults()); tun, erhalten Sie das Versprechen-Objekt.

das gewünschte Ergebnis, dass für den Hinweis auf

getResults(urls).then(function(results){ 
    console.log(results); 
}) 
+1

Auch zu verwenden hat 'dann()', wenn Aufruf dieser Funktion – charlietfl

+0

Dank tun müssen, um zu sehen @charlietfl ich es auf meine Antwort gegeben. – Stamos

+1

Da dies als richtig ausgewählt wurde, nehme ich an, dass es funktioniert. Ich war mir nicht sicher, worauf das in diesen Ergebnissen hindeutet. Ich dachte, es würde auf die Funktion in der dann in Promise zeigen. – UchihaItachi

Verwandte Themen