Reputation: 11
I have a problem
async function checkOk(listNotOkLocation) {
// console.log(listNotOkLocation)
var lenNotOk = listNotOkLocation.length
if (lenNotOk == 0) return 'green'
var latMarker = markerLocation.getPosition().lat()
var lngMarker = markerLocation.getPosition().lng()
var origin = latMarker.toString() + ", " + lngMarker.toString()
for (var i = 0; i < lenNotOk; i++) {
var lat = listNotOkLocation[i].lat
var lng = listNotOkLocation[i].lng
var destination = lat.toString() + ", " + lng.toString()
calcRoute(origin,destination, function (err, dist) {
console.log(1)
if (!err) {
if (dist <= minDistance)
return 'red'
}
});
}
console.log(2)
return 'green'
}
Function calcRoute in for loop takes time, so function checkOk always returns 'green'. Can someone help me to solve this problem?
Upvotes: 0
Views: 124
Reputation:
wrap your calcRoute
into something that returns a promise
function calcRouteP(origin, destination) {
return new Promise((resolve, reject) => {
calcRoute(origin, destination, function (err, dist) {
if (err) {
reject(err);
} else {
resolve(dist);
}
});
});
}
Then use it in your async function
async function checkOk(listNotOkLocation) {
// console.log(listNotOkLocation)
var lenNotOk = listNotOkLocation.length
if (lenNotOk == 0) return 'green'
var latMarker = markerLocation.getPosition().lat()
var lngMarker = markerLocation.getPosition().lng()
var origin = latMarker.toString() + ", " + lngMarker.toString()
for (var i = 0; i < lenNotOk; i++) {
var lat = listNotOkLocation[i].lat
var lng = listNotOkLocation[i].lng
var destination = lat.toString() + ", " + lng.toString()
var dist = await calcRouteP(origin,destination);
if (dist <= minDistance) {
return 'red'
}
}
console.log(2)
return 'green'
}
note that for functions who's last argument is a callback that is passed err, result
like your calcRoute
function there are often libraries to do the wrapping for you. In node.js instead of wrapping calcRoute
yourself you can do this
const util = require('util');
const calcRouteP = util.promisifiy(calcRoute);
Upvotes: 3