承诺响应参数丢失

Promise response argument getting lost

本文关键字:参数 响应 承诺      更新时间:2023-09-26

我正在学习浏览器提供的承诺,但我很难理解响应参数丢失并且无法通过。这是我的代码:

/* 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。