节点 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
.
的回调中的解析值可用
使用 async
和 await
语法变得更容易一些。所以你可能也想研究一下。
我正在为一个课程项目工作,我需要将多个 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
. 的回调中的解析值可用
使用
async
和await
语法变得更容易一些。所以你可能也想研究一下。