节点 js 连续 API 个调用未执行

node js Consecutive API calls not executing

我正在为一个课程项目工作,我需要将多个 API 调用链接在一起。当前,第一个 API 调用函数中的所有内容都会执行并显示在终端中,但第一个 API 调用之后的所有内容都不会执行任何操作。我正在接受用户在表单中输入的位置和日期。第一个 API 调用有效。它将位置转换为纬度和经度,然后将日期 (MM/DD/YYYY) 分成三个变量,月份、日期和年份,并将它们存储在我的 projectData 对象中,然后我需要使用它来制作第二个 API 打电话。问题在于,在第一个 API 调用函数执行并将所有内容存储到 projectData 对象之后,之后的所有内容都不执行任何操作。我尝试使用来自第一个 API 调用的所有存储信息来记录新的 projectData 对象,但我没有看到它记录在终端中。然后我尝试从 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 函数后获取所有代码?

非常感谢, 迈克尔

如果您想知道 then 回调何时在 geonames 中执行,请确保 return 承诺,并且在调用后链接一个 then

所以在 geonames:

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

它的名字在哪里:

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

一些备注:

  • then 回调中改变全局变量不是一个好习惯。相反,让 then 回调 return 任何 new/calculated 值。这将作为提供给 geonames().then.

  • 的回调中的解析值可用
  • 使用 asyncawait 语法变得更容易一些。所以你可能也想研究一下。