jQuery ajax 使用 ES6 Promises
jQuery ajax with ES6 Promises
我正在尝试使用 ES6 promise 通过 jQuery 发出 post 请求:
我有一个功能:
getPostPromise(something, anotherthing) {
return new Promise(function(resolve, reject) {
$.ajax({
url: someURL,
type: 'post',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(
something: something,
anotherthing: anotherthing
}),
dataType: 'json',
success: resolve,
error: reject
});
});
}
我这样称呼它:
getPostPromise(
'someFooStuff',
'someBarStuff'
).then(
function(returnedData) {
console.log("Good: ", returnedData);
},
function(responseObject) {
console.log("Bad: ", responseObject);
}
).catch(
function(errorThrown) {
console.log("Exception: ", errorThrown);
}
);
我的服务器按预期返回响应,请求正文采用 JSON 格式,但我的控制台输出是:
Good: undefined
为什么我没有得到返回的数据?
感谢 anyone/everyone 的帮助。
---更新编辑---
我已经将我的 js 减少到只有:
import $ from 'jquery';
$.get('http://localhost:8008/api/user')
.done(function(data) {
console.log(data);
});
我仍然得到未定义的输出。如果我在网络选项卡中打开请求,我可以看到包含正确数据的响应对象。发出请求,我的服务器很高兴并做出响应,结果在我的浏览器中,但 done 的数据参数未定义。我被难住了。
--- 更新 2 - 找到解决方案 ---
我发现问题在于使用:https://github.com/jpillora/xdomain 绕过 CORS。看起来该库以某种方式搞砸了传回值。我已经删除了它,并将正确地实现 CORS 并与不支持它的浏览器一起见鬼去吧。
jQuery Ajax 方法 return 承诺自己,您根本 不需要 包装它们。
但是您当然可以为了与 ES6 承诺保持一致而这样做 API。
更新 jQuery 3.0+ 实现 the Promise/A+ API, so there is no reason anymore to wrap anything in modern jQuery. Read up on the peculiarities of jQuery's promise implementation prior to version 3.0.
对于3.0之前的jQuery版本,我会比你解耦得更多:
function ajax(options) {
return new Promise(function (resolve, reject) {
$.ajax(options).done(resolve).fail(reject);
});
}
和
ajax({
url: someURL,
type: 'post',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
something: something,
anotherthing: anotherthing
})
}).then(
function fulfillHandler(data) {
// ...
},
function rejectHandler(jqXHR, textStatus, errorThrown) {
// ...
}
).catch(function errorHandler(error) {
// ...
});
我正在尝试使用 ES6 promise 通过 jQuery 发出 post 请求:
我有一个功能:
getPostPromise(something, anotherthing) {
return new Promise(function(resolve, reject) {
$.ajax({
url: someURL,
type: 'post',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(
something: something,
anotherthing: anotherthing
}),
dataType: 'json',
success: resolve,
error: reject
});
});
}
我这样称呼它:
getPostPromise(
'someFooStuff',
'someBarStuff'
).then(
function(returnedData) {
console.log("Good: ", returnedData);
},
function(responseObject) {
console.log("Bad: ", responseObject);
}
).catch(
function(errorThrown) {
console.log("Exception: ", errorThrown);
}
);
我的服务器按预期返回响应,请求正文采用 JSON 格式,但我的控制台输出是:
Good: undefined
为什么我没有得到返回的数据?
感谢 anyone/everyone 的帮助。
---更新编辑---
我已经将我的 js 减少到只有:
import $ from 'jquery';
$.get('http://localhost:8008/api/user')
.done(function(data) {
console.log(data);
});
我仍然得到未定义的输出。如果我在网络选项卡中打开请求,我可以看到包含正确数据的响应对象。发出请求,我的服务器很高兴并做出响应,结果在我的浏览器中,但 done 的数据参数未定义。我被难住了。
--- 更新 2 - 找到解决方案 ---
我发现问题在于使用:https://github.com/jpillora/xdomain 绕过 CORS。看起来该库以某种方式搞砸了传回值。我已经删除了它,并将正确地实现 CORS 并与不支持它的浏览器一起见鬼去吧。
jQuery Ajax 方法 return 承诺自己,您根本 不需要 包装它们。
但是您当然可以为了与 ES6 承诺保持一致而这样做 API。
更新 jQuery 3.0+ 实现 the Promise/A+ API, so there is no reason anymore to wrap anything in modern jQuery. Read up on the peculiarities of jQuery's promise implementation prior to version 3.0.
对于3.0之前的jQuery版本,我会比你解耦得更多:
function ajax(options) {
return new Promise(function (resolve, reject) {
$.ajax(options).done(resolve).fail(reject);
});
}
和
ajax({
url: someURL,
type: 'post',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
something: something,
anotherthing: anotherthing
})
}).then(
function fulfillHandler(data) {
// ...
},
function rejectHandler(jqXHR, textStatus, errorThrown) {
// ...
}
).catch(function errorHandler(error) {
// ...
});