Javascript 节点js连续API调用未执行
我正在为一个课程的项目工作,我需要将多个API调用链接在一起。当前,第一个API调用函数中的所有内容都会在终端中执行和显示,但第一个API调用后的所有内容都不会执行任何操作。我在表单中获取用户输入的位置和日期。第一个API调用起作用。它将位置转换为纬度和经度,然后将日期(MM/DD/YYYY)分为三个变量:月、日期和年,并将它们存储在projectData对象中,然后我需要使用该对象进行第二次API调用。问题是,在第一个API调用函数执行并将所有内容存储到projectData对象之后,之后的所有内容都不起任何作用。我尝试使用第一个API调用中存储的所有信息记录新的projectData对象,但在终端中没有看到它被记录。然后我尝试从projectData中提取新存储的数据,并在第二个API调用函数中使用它,但它什么也不做。以下是相关代码:Javascript 节点js连续API调用未执行,javascript,node.js,api,express,node-fetch,Javascript,Node.js,Api,Express,Node Fetch,我正在为一个课程的项目工作,我需要将多个API调用链接在一起。当前,第一个API调用函数中的所有内容都会在终端中执行和显示,但第一个API调用后的所有内容都不会执行任何操作。我在表单中获取用户输入的位置和日期。第一个API调用起作用。它将位置转换为纬度和经度,然后将日期(MM/DD/YYYY)分为三个变量:月、日期和年,并将它们存储在projectData对象中,然后我需要使用该对象进行第二次API调用。问题是,在第一个API调用函数执行并将所有内容存储到projectData对象之后,之后的所
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)
地理名称功能:
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)
}
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)
}
darkskyFetch函数:
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)
}
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函数之后的所有代码
非常感谢,
Michael如果您想知道
然后
回调何时在geonames
中执行,那么请确保返回承诺,并在调用后链接一个然后
因此在geonames
中:
return fetch( .....
// ^^^^^^
它的名称是:
geonames(place, GEONAMES_API).then(() => {
// all code that needs to execute after the geonames promise resolves
});
一些评论:
- 在
然后
回调中变异全局变量不是一个好的做法。相反,让该
回调返回任何新的/计算出的值。这将成为提供给
geonames()的回调中的解析值。然后
- 使用
和async
时,语法会变得更简单。所以你可能也想调查一下wait