我试图DRY一个JavaScript文件,使几 AJAX 调用。我有一个函数,它进行 AJAX 调用,返回一个包含其他ajax调用所需细节的对象。
const makeCall = (url, type, data, done) => {
$.ajax({
url: url,
type: type,
dataType: "json",
data: data,
})
.done(done)
.fail(function(error) {
console.log(error);
});
};
const country = await $.ajax({
url: "libs/php/opencage.php",
type: "GET",
dataType: "json",
data: {
LAT: x.coords.latitude,
LNG: x.coords.longitude,
},
})
.done(function(result) {
if (result.status.name == "ok") {
//populate the detail object with responses from opencage needed to communicate with other apis
detail.lat = x.coords.latitude;
detail.long = x.coords.longitude;
detail.continent = result.data.results[0].components.continent;
detail.countryName = result.data.results[0].components.country;
detail.countryCode = result.data.results[0].components.country_code;
let code = result.data.results[0].components.country_code;
//set the select to user country
console.log(code);
$("#countrySelect").val(code.toUpperCase());
}
})
.fail(function(error) {
// your error code
console.log(error);
});
//save needed part of detail object for easy access
let latitude = detail.lat;
let longitude = detail.long;
let countryName = noSpace(detail.countryName);
let countryCode = detail.countryCode;
let continent = detail.continent;
//makecall to retrieve geojson feature details for selected country.
makeCall(
"libs/php/retrieveCountry.php",
"GET", {
code: countryCode.toUpperCase()
},
function(r) {
//add the geojson object to the map
L.geoJSON(r).addTo(map);
}
);
字符串
这个很好用。为了干燥代码,我使用makeCall函数进行了等待 AJAX 调用。会发生的情况是,对retrieveCountry.php的第二个makeCall没有执行,因为gejson特性从未添加到Map中。我也得到一个警告:'await'对这个运算式的型别没有任何影响。ts(80007)
const country = await makeCall(
"libs/php/opencage.php",
"GET", {
LAT: x.coords.latitude,
LNG: x.coords.longitude,
},
function(result) {
if (result.status.name == "ok") {
//populate the detail object with responses from opencage needed to communicate with other apis
detail.lat = x.coords.latitude;
detail.long = x.coords.longitude;
detail.continent = result.data.results[0].components.continent;
detail.countryName = result.data.results[0].components.country;
detail.countryCode = result.data.results[0].components.country_code;
let code = result.data.results[0].components.country_code;
//set the select to user country
console.log(code);
$("#countrySelect").val(code.toUpperCase());
return detail;
}
}
);
//save needed part of detail object for easy access
let latitude = detail.lat;
let longitude = detail.long;
let countryName = noSpace(detail.countryName);
let countryCode = detail.countryCode;
let continent = detail.continent;
//makecall to retrieve geojson feature details for selected country. This part is never implemented as this feature is not added to the map.
makeCall(
"libs/php/retrieveCountry.php",
"GET", {
code: countryCode.toUpperCase()
},
function(r) {
//add the geojson object to the map
L.geoJSON(r).addTo(map);
}
);
型
拜托,有什么不对吗?另外值得添加的是,整个代码都在一个异步函数中,并且detail对象的作用域是本地的,即该异步函数
1条答案
按热度按时间jv4diomz1#
没有任何东西等待 AJAX 操作,警告是关于原因的线索。具体来说,它告诉你
await
在这里什么也不做:字符串
这是因为
makeCall
不可等待。它不是async
,它不返回任何东西:型
由于
$.ajax()
操作 * 是 * 可等待的,因此您的意图似乎是返回:型
这将返回来自
$.ajax()
本身的awaitable(“then-able”)结果,然后消费代码可以await
(或跟随.then()
)。