I have been using JavaScript for about a year and a half now, but I still have a fundamental misunderstanding of Promises and can never get them to work.
Can someone tell me what is wrong with this code and why it doesn't wait for the promise to fulfill?
let sitesGeo = [];
let p = new Promise((resolve, reject) => {
sitesGeo = getSitesGeo(currentBatch, sitesUrl, sitesGeo);
resolve(sitesGeo);
}).then((sitesGeo) => {
console.log("sites geometry ", sitesGeo);
});
I keep getting undefined for "sites geometry" and I know it's because it is being logged before the promise gets resolved. I know that the function getSitesGeo works because I have another log statement inside of it and it returns the result.
What am I getting wrong, and how to I get console.log statement to wait for the promise to resolve before executing?
Here is the code so maybe this will help to understand why it is not working;
function getSitesGeo(currentBatch, sitesUrl) {
console.log("getting sites geometry");
var sitesGeoArray = [];
var queryTask = new QueryTask(sitesUrl);
var batchQuery = new Query();
batchQuery.where = "Batch = " + currentBatch;
batchQuery.outFields = ["*"];
batchQuery.returnGeometry = true;
queryTask.execute(batchQuery).then(function(result) {
console.log("sites geometry ", result);
let features = result.features;
features.forEach(function(feature) {
var geometry = feature.geometry;
if(isNaN(parseFloat(geometry.x)) === false) {
sitesGeoArray.push(geometry);
}
})
console.log("sites array ", sitesGeoArray);
console.log("geometry type = ", typeof(sitesGeoArray));
return sitesGeoArray;
});
}
function getBatchNumnber() {
var sitesUrl =
"https://ocean.floridamarine.org/arcgis/rest/services/.../MapServer/0";
var queryTask = new QueryTask(sitesUrl);
var batchQuery = new Query();
var statDef = new StatisticDefinition();
statDef.statisticType = "max";
statDef.onStatisticField = "Batch";
statDef.outStatisticsFieldName = "CurrentBatch";
batchQuery.where = "1=1";
batchQuery.outFields = ["*"];
batchQuery.outStatistics = [statDef];
batchQuery.returnGeometry = true;
queryTask.execute(batchQuery).then((result) => {
console.log("batch query result ", result);
var currentBatch = result.features[0].attributes.MAX_Batch;
window.currentBatch = currentBatch;
//var sitesGeoArray = [];
async function createSitesGeoArray(currentBatch, sitesUrl) {
return new Promise((resolve, reject) => {
const sitesGeo = await getSitesGeo(currentBatch, sitesUrl);
resolve (sitesGeo);
});
}
createSitesGeoArray(currentBatch, sitesUrl)
.then(result => {
console.log("sites geometry = ", result);
})
I re-wrote the async function to :
async function createSitesGeoArray(currentBatch, sitesUrl) {
let promise = new Promise((resolve, reject) => {
const sitesGeo = getSitesGeo(currentBatch, sitesUrl);
resolve (sitesGeo);
});
let result = await promise;
//return result;
}
createSitesGeoArray(currentBatch, sitesUrl)
.then(result => {
console.log("sites geometry = ", result);
})
I don't get any errors, result is now undefined (not waiting to resolve)
getSitesGeo
function doesn't return anything. It must return a promise. – dmh126 May 3 '19 at 20:12