承诺响应参数丢失
Promise response argument getting lost
我正在学习浏览器提供的承诺,但我很难理解响应参数丢失并且无法通过。这是我的代码:
/* uploads a resource to the given server and runs the callback function when done */
function upload(serverUrl, resource, successfulCallback, failCallback) {
console.log("upload successfulCallback: ", successfulCallback);
console.log("upload failCallback: ", failCallback);
var jqxhr = $.ajax({
url: serverUrl,
method: "POST",
type: "POST",
contentType: "application/json",
data: encode(resource),
headers: {
Accept: "application/json; charset=utf-8",
Prefer: "return=minimal"
}
}).done(function() {
console.log("Upload done, jqxhr: ", jqxhr);
successfulCallback(jqxhr);
}).fail(function(err) {
console.log("upload failed: " + err.responseText);
failCallback(jqxhr, err);
});
}
function validate(endpoint, resource) {
var parameters = {
"resourceType": "Parameters",
"parameter": [{
"name": "resource",
"resource": resource
}]
};
return new Promise(function (resolve, reject) {
console.log("Made new promise, resolve function is: ", resolve);
console.log("Made new promise, reject function is: ", reject);
upload(endpoint + '/' + resource.resourceType + "/$validate", parameters, resolve, reject);
});
}
这就是我使用它的方式:
validate("http://fhir3.healthintersections.com.au/open", decode(leftFhirView.getValue()))
.then(function(response) {
console.log("It worked! '", response, "'");
}, function(error) {
console.error("Failed validation!", error.stack);
});
这是我运行时得到的调试输出
main.js:45 Made new promise, resolve function is: u() { [native code] }
main.js:46 Made new promise, reject function is: v() { [native code] }
main.js:14 upload successfulCallback: u() { [native code] }
main.js:15 upload failCallback: v() { [native code] }
main.js:27 Upload done, jqxhr: Object {readyState: 4, responseText: "", <snip>
main.js:196 It worked! ' '
如您所见,在 successCallback(jqxhr( 和响应函数之间的某个地方,我的 jqxhr 变成了两个空格。发生了什么事情?
通过验证函数一直返回 jQuery 承诺来修复它。
解释 X @Jaromanda评论中所说的话。
您正在尝试解析另一个Promise
中的Promise
。原始Promise
对象不会传递给then
的回调。相反,它将是原始Promise
对象中的响应文本。
在这种情况下,jqxhr
是原始Promise
($.ajax
返回一个Promise
对象(,其响应文本为 ""
。这就是为什么你会得到一个空字符串。
根据 MDN 的文档,您的代码与以下示例相同
var original = Promise.resolve(true);
var cast = Promise.resolve(original);
cast.then(function(v) {
console.log(v); // true
});
**更新于 11/14/16
@Bergi指出,jqxhr
不是Promise
的实例,而是一个具有属性then
(类似promise(的JQuery延迟对象。但是,Promise.then
会寻找jqxhr.then
,如果有这样的属性,它会异步解析 promise。
相关文章:
- 如何使用jQueryAjax后响应参数
- 使用不同参数的超级代理缓存缓存 HTTP 响应
- 在转发到代理目标并将响应发送回客户端之前,编辑POST参数
- JSON响应参数
- React native:如何将参数传递给手势响应程序回调
- 如何将一些参数从javascript接收响应字符串 asp.net 页面并更新html文档
- 如何在 NodeJS 中传递响应参数,包括来自 POST http.request 的正文
- 过滤器 AngularJS REST JSON 数据:错误:badcfg 响应与配置的参数不匹配
- 如何将返回响应的预定义 JavaScript 回调作为参数传递到函数中
- 需要帮助实现响应径向菜单的jquery参数
- 如何从Ajax响应调用中获取目标页面上的数据参数
- Sailsjs:基于请求参数设置响应方法
- Loadrunner服务器响应参数未找到Javascript
- 流星:使外部脚本参数响应
- 如何在 Angular 中的响应 URL 中捕获参数(条带连接)
- 承诺响应参数丢失
- Ajax调用javascript的参数和得到响应,node-webkit
- 向AJAX响应添加参数,然后根据返回参数应用操作
- $.getJSON - 在 url 中使用参数时无法捕获响应
- 我应该用什么来击中一个远程url的参数,并在代码中使用响应