2017-02-01 4 views
0

アレイ処理でES6 Promisesチェーンを使用する際に助けが必要です。アレイでの約束の方法

Promise.allメソッドに入る配列の各項目を処理/定義するには、resolve内に他の非同期メソッドがある場合はどうすればいいですか?ここで

は簡単な例です:

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

答えて

1

あなたはplaceを取得し、それが利用可能なときは、必要なオブジェクトを返しますあなたの最初の約束に.then()ハンドラを追加する場所、このようにそれを行うことができます。 、

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あなたが約束を超える変換しているので、なぜちょうどgetData()から約束を返さないし、全くそこにコールバックを使用しない:あなたのPromise.all()の解決結果は、あなたがしたいオブジェクトの配列になります?あなたの現在のコードは、約束して無料で提供されるものであるgetData()からのエラーを返信する方法がありません。純粋な約束と実際に

getData()は、このように単純化することができます

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