Если вы используете Node 8, вы можете использовать async / await, чтобы распутать вложенную структуру обратного вызова.Это обеспечит завершение асинхронных вызовов перед продолжением следующего вызова, который зависит от другого асинхронного значения.
app.intent('saving_prompt', async (conv) => {
if (conv.data.area) {
const deviceCoordinatesStart = conv.device.location.coordinates;
const latitudeValueStart = deviceCoordinatesStart.latitude;
const longitudeValueStart = deviceCoordinatesStart.longitude;
let start = moment(); //Start time in UTC, you could also use dateTime()
let startTz = momentTz(); //used because of getting the Timezone
const timestamp = 1402629305; // Just a dud placeholder to fulfil timezone function
const startLocation = await new Promise((resolve, reject) => {
geocoder.reverse({ lat: latitudeValueStart, lon: longitudeValueStart }, (err, res) => {
if (err) {
console.log(err);
reject(err);
} else {
resolve(res[0].administrativeLevels.level1long);
}
});
});
const localTime = await new Promise((resolve, reject) => {
timezone.data(latitudeValueStart, longitudeValueStart, timestamp, (err, tz) => {
if (err) {
console.log(err);
reject(err);
} else {
var zoneHolder = tz.raw_response.timeZoneId;
resolve(startTz.tz(zoneHolder).format('LLL'));
}
});
});
app.ask('Your race starts by ' + localTime + 'at' + startLocation);
conv.ask(new Suggestions('End Race'));
} else { //Returned if permission not granted
conv.ask('You do not have your location on. Say "Locate me", to retrieve your location');
conv.ask(new Suggestions(['Locate me', 'Exit']));
}
});