Как получить значения из ожидающих обещаний? - PullRequest
0 голосов
/ 14 марта 2020

У меня сейчас проблемы с выводом ниже. Может кто-нибудь сказать мне, что не так с кодом, который мешает мне получить следующий вывод, который я хочу? Заранее спасибо!

Код:

 // http requests
 const getJSON = require('get-json');

 function getShopLocation(postalCode) {
 // Use promise to resolve when success
 return new Promise((resolve, reject) => {
 // One Map API is used to retrieve Lat & Lon & more map details
 var oneMapURL = `https://developers.onemap.sg/commonapi/search?searchVal=${postalCode}&returnGeom=Y&getAddrDetails=Y&pageNum=1`;
 getJSON(oneMapURL, function(error, response) {

 if (response) {
  // Get only the lat
  var lat = response.results[0].LATITUDE;
  // Resolve the location details
  resolve(lat);
} else {
  reject(error);
}
});
});
}

 function init() {
    var postalCode = [ 519498, 629117, 670445, 258748, 238884 ];
    var title = ['Place A', 'Place B', 'Place C', 'Place D', 'Place E'];
    var data = [];

    var i = 0;
    for (i = 0; i < postalCode.length; ++i) {
        var lat = getShopLocation(postalCode[i]);
        data.push({ title: title[i] , lat: lat});
    }

    Promise.all(data)
    .then((results) => {
        console.log("Data Output: ", results);
    })
    .catch((e) => {
        // Handle errors here
        console.log(error);
    });
    }
    init();

Вывод Я хочу:

[
  { title: 'Place A', lat: 1.322595392 },
  { title: 'Place B', lat: 1.325617641 },
  { title: 'Place C', lat: 1.325617641 },
  { title: 'Place D', lat: 1.3835802030000002 },
  { title: 'Place E', lat: 1.3061957990000002 }
]

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Вы помещаете объекты в массив данных, которые фактически не являются обещаниями. Вам нужно записать sh фактические обещания в массив, чтобы использовать их внутри Promise.all

Я внес необходимые изменения в ваш код для правильной работы, используйте следующий код:

 // http requests
 const getJSON = require('get-json');

 function getShopLocation(postalCode) {
   // Use promise to resolve when success
   return new Promise((resolve, reject) => {
     // One Map API is used to retrieve Lat & Lon & more map details
     var oneMapURL = `https://developers.onemap.sg/commonapi/search?searchVal=${postalCode}&returnGeom=Y&getAddrDetails=Y&pageNum=1`;
     getJSON(oneMapURL, function(error, response) {

       if (response) {
         // Get only the lat
         var lat = response.results[0].LATITUDE;
         // Resolve the location details
         resolve(lat);
       } else {
         reject(error);
       }
     });
   });
 }

 function init() {
   var postalCode = [519498, 629117, 670445, 258748, 238884];
   var title = ['Place A', 'Place B', 'Place C', 'Place D', 'Place E'];
   var data = [];

   var i = 0;
   var promiseArr = [];
   for (i = 0; i < postalCode.length; ++i) {
     var lat = getShopLocation(postalCode[i]);
     promiseArr.push(lat);
   }

   Promise.all(promiseArr)
     .then((results) => {
       console.log("Data Output: ", results);
       for (let j = 0; j < promiseArr.length; j++) {
         data.push({
           title: title[j],
           lat: promiseArr[j],
         })
       }
       console.log(data); // This is my final answer.
     })
     .catch((e) => {
       // Handle errors here
       console.log(error);
     });
 }
 init();
1 голос
/ 14 марта 2020

Поскольку вы используете data с Promise.all, это должен быть массив обещаний. И getShopLocation возвращает обещание широты, а не фактической широты.

Возможно, вы захотите использовать

for (let i = 0; i < postalCode.length; ++i) {
    var latPromise = getShopLocation(postalCode[i]);
    var objPromise = latPromise.then(lat => ({ title: title[i] , lat: lat}));
    data.push(objPromise);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...