node js Последовательные вызовы API не выполняются - PullRequest
0 голосов
/ 11 марта 2020

Я работаю над проектом для курса, где мне нужно объединить несколько вызовов API вместе. В настоящее время все в первой функции вызова API выполняется и отображается в терминале, но все после первого вызова API ничего не делает. Я принимаю пользовательский ввод местоположения и даты в форме. Первый вызов API работает. Он преобразует местоположение в широту и долготу, а затем разделяет дату (ММ / ДД / ГГГГ) на три переменные: месяц, дату и год и сохраняет их в моем объекте projectData, который я затем должен использовать для второго вызова API. Проблема в том, что после того, как первая функция вызова API выполняется и сохраняет все в объекте projectData, все, что после этого ничего не делает. Я пытаюсь зарегистрировать новый объект projectData со всей сохраненной информацией из первого вызова API, но я не вижу его зарегистрированным в терминале. Затем я пытаюсь извлечь вновь сохраненные данные из projectData и использовать их во второй функции вызова API, но это ничего не делает. Это соответствующий код:

GEONAMES_API = process.env.GEONAMES_ID
darksky_key = process.env.DARKSKY_KEY
console.log(darksky_key)
console.log(GEONAMES_API);
projectData = {one: {coord: {lat: '', lng: ''}, date: ''}, two: {month: '', day: '', year: ''}, three: {}};
place = {}; 

app.post('/postData', getData);

function getData(req, res){
    console.log(req.body.data);
    place = req.body.data.place;
    date = req.body.data.date;
    projectData.one.date = date;
    console.log(projectData)
    console.log(date)
    console.log(place)
    geonames(place, GEONAMES_API)
    console.log(projectData)
    lat = projectData.one.coord.lat;
    lng = projectData.one.coord.lng;
    month = projectData.two.month;
    day = projectData.two.day;
    year = projectData.two.year;
    darkskyFetch(lat, lng, month, day, year, darksky_key)

функция geonames:

function geonames(place, id){
    fetch(`http://api.geonames.org/searchJSON?name=${place}&username=${id}`)
    .then(response => response.json())
    .then(data => {
        console.log(data)
        lng = data.geonames[1].lng
        lat = data.geonames[1].lat
        console.log(lng)
        console.log(lat)
        projectData.one.coord.lat = lat;
        projectData.one.coord.lng = lng;
        console.log(projectData)
        console.log(projectData)
        lat = projectData.one.coord.lat;
        lng = projectData.one.coord.lng;
        date = projectData.one.date;
        console.log(lat)
        console.log(lng)
        date_split = date.split("/")
        console.log(date_split)
        month = date_split[0]
        day = date_split[1]
        year = date_split[2]
        console.log(month)
        console.log(day)
        console.log(year)
        projectData.two.month = month;
        projectData.two.day = day;
        projectData.two.year = year;
        console.log(projectData)
    })
    .catch(error => error)

}

функция darkskyFetch:

function darkskyFetch(lat, lng, month, day, year, darksky_key){
    fetch(`https://api.darksky.net/forecast/${darksky_key}/${lat},${lng},${year}-${month}-${day}`)
    .then(response => response.json())
    .then(data => {
        console.log(data)
    })
    .catch(error => eerror)
}

Как получить весь код после функции geonames выполнить?

Большое спасибо, Майкл

1 Ответ

0 голосов
/ 11 марта 2020

Если вы хотите знать, когда выполнялись обратные вызовы then в geonames, убедитесь, что вернули обещание и поставили then в цепочку после его вызова.

Так в geonames:

   return fetch( .....
// ^^^^^^

И где это называется:

geonames(place, GEONAMES_API).then(() => {
    // all code that needs to execute after the geonames promise resolves
});

Некоторые замечания:

  • Это не так хорошая практика - мутировать глобальные переменные в вашем then обратном вызове. Вместо этого пусть then callback возвращает любые новые / вычисленные значения. Это станет доступным как разрешенное значение в обратном вызове, который предоставляется geonames().then.

  • Синтаксис становится немного проще с async и await. Так что, возможно, вы захотите посмотреть и на это.

...