我目前正在为浏览器编写代码并限制使用ES5。我有权访问jQuery,我需要重写几个当前使用ES6承诺的大型函数。例如:
function getLocationFromIp() {
return new Promise(function (resolve, reject) {
$.ajax({
url: someUrl,
data: {},
xhrFields: {
withCredentials: true
},
success: function (data) {
resolve(data);
},
error: function (err) {
reject(err);
}
});
}).then(transformIpGeoDataToLocation);
}
我了解我可以访问.resolve()
和.reject()
,但我正在努力实施。它看起来像这样吗?
function getLocationFromIp() {
return $.Deferred(function (dfr) {
$.ajax({
url: someUrl,
data: {},
xhrFields: {
withCredentials: true
},
success: function (data) {
dfr.resolve(data);
},
error: function (err) {
dfr.reject(err);
}
});
}).promise().then(transformIpGeoDataToLocation);
}
我也将蓝鸟看作是一个后备,但是我想给这个方法一个机会,谢谢!不幸的是,Babel和其他编译器不是一种选择。
答案 0 :(得分:3)
所以,如果你不想使用ES6 promises并且想要使用jQuery promises,函数调用$.ajax()
已经返回一个jQuery promise,所以不需要将它包装在另一个promise中。您可以直接返回$.ajax()
已经返回的承诺:
function getLocationFromIp() {
return $.ajax({
url: someUrl,
data: {},
xhrFields: {
withCredentials: true
}).then(transformIpGeoDataToLocation);
}
注意:在3.x之前的jQuery版本中,jQuery承诺(特别是来自Ajax调用)不会解析与ES6承诺完全相同的数据类型。特别是jQuery Ajax承诺解析有三个参数(不是ES6标准的一个)。第一个参数是人们通常使用的结果。您可以使用它,但需要确保.then()
等transformIpGeoDataToLocation
处理程序知道这一点。
答案 1 :(得分:0)
jQuery ajax返回一个promise对象,从1.8开始,你可以通过.then
访问它来查看此处的引用:http://api.jquery.com/jquery.ajax/
我包含一些/有点过剩以显示它可能如何工作。
function getLocationFromIp() {
return $.ajax({
url: someUrl,
data: {},
xhrFields: {
withCredentials: true
}
})
.done(function(data, textStatus, jqXHR) {
alert("success");
})
.fail(function(jqXHR, textStatus, errorThrown) {
alert("error");
})
.always(function(data | jqXHR, textStatus, jqXHR | errorThrown) {
alert("complete");
})
// combines done/fail, see reference page
.then(transformIpGeoDataToLocation // gets passed data, textStatus, jqXHR
,
function(jqXHR, textStatus, errorThrown) {})// fail in then
}
getLocationFromIp().then(somefunctiontocall);