2017-02-01 6 views
0

Ich brauche Hilfe mit ES6 Promises Verkettung in Array-Verarbeitung.Wie verketten Versprechen in Array

Wie zu verarbeiten/zu definieren jedes Element des Arrays, die in Promise.all Methode geht, wenn es andere async-Methode innerhalb löst?

Hier wird beispielsweise vereinfacht:

function getData(data, callback) { 
    let groupPromises = data.map(row => { 
     var coordinates = getCoordinates(row); 
     return Promise.resolve({ 
      "place": getPlaces(coordinates), //how to invoke this method 
      "data": row 
     }; 
    });  
    Promise.all(groupPromises) 
     .then(groups => callback(groups)) 
     .catch(err => console.log(err)); 
    } 
} 

function getPlaces(coordinates) { 
    return new Promise(function(resolve, reject) { 
     if(coordinates == null) { 
      reject(); 
     } 
     parameters = { 
      location: [coordinates.latitude, coordinates.longitude], 
      rankby: "distance", 
     }; 
     googlePlaces.searchPlace(parameters, function (error, response) { 
      if (error) { 
       reject(error); 
      }; 
      resolve(response); 
     }); 
    } 
} 

Antwort

1

Sie es so tun können, in dem Sie eine .then() Handler zu Ihrem ersten Versprechen hinzufügen, die die place und dann bekommt, wenn das ist verfügbar kehrt das gewünschte Objekt. Die aufgelösten Ergebnisse Ihrer Promise.all() wird dann die Anordnung von Objekten, die Sie wollen:

function getData(data, callback) { 
    let groupPromises = data.map(row => { 
     var coordinates = getCoordinates(row); 
     // add .then() handler here to convert the place result 
     // into the object you want it in 
     return getPlaces(coordinates).then(place => { 
      return {place: place, data: row}; 
     }); 
    });  
    return Promise.all(groupPromises) 
     .then(groups => callback(groups)) 
     .catch(err => { 
      console.log(err); 
      throw err; 
     }); 
    } 
} 

function getPlaces(coordinates) { 
    return new Promise(function(resolve, reject) { 
     if(coordinates == null) { 
      reject(); 
     } 
     parameters = { 
      location: [coordinates.latitude, coordinates.longitude], 
      rankby: "distance", 
     }; 
     googlePlaces.searchPlace(parameters, function (error, response) { 
      if (error) { 
       reject(error); 
      }; 
      resolve(response); 
     }); 
    } 
} 

FYI, da Sie die Umstellung auf Versprechungen über, warum Rückkehr nicht nur das Versprechen von getData() und einen Rückruf nicht dort verwenden überhaupt ? Ihr aktueller Code hat keine Möglichkeit, einen Fehler von getData() zurückzusenden, was weitgehend kostenlos ist.

function getData(data, callback) { 
    return Promise.all(data.map(row => { 
     return getPlaces(getCoordinates(row)).then(function(place) { 
      return {place: place, data: row}; 
     }); 
    }));  
} 
:

In der Tat mit reinem Versprechen, dazu werden getData() könnte vereinfacht

Verwandte Themen