Javascript 承诺-回应-论点迷失

Javascript 承诺-回应-论点迷失,javascript,promise,Javascript,Promise,我正在学习浏览器提供的承诺,我很难理解“回应”这一论点是否会迷失方向而无法通过。这是我的代码: /*将资源上载到给定服务器,完成后运行回调函数*/ 函数上载(服务器URL、资源、成功回调、失败回调){ log(“上传成功回调:”,成功回调); log(“上传失败回调:”,失败回调); var jqxhr=$.ajax({ url:serverUrl, 方法:“张贴”, 类型:“POST”, contentType:“应用程序/json”, 数据:编码(资源), 标题:{ 接受:“applica

我正在学习浏览器提供的承诺,我很难理解“回应”这一论点是否会迷失方向而无法通过。这是我的代码:

/*将资源上载到给定服务器,完成后运行回调函数*/
函数上载(服务器URL、资源、成功回调、失败回调){
log(“上传成功回调:”,成功回调);
log(“上传失败回调:”,失败回调);
var jqxhr=$.ajax({
url:serverUrl,
方法:“张贴”,
类型:“POST”,
contentType:“应用程序/json”,
数据:编码(资源),
标题:{
接受:“application/json;charset=utf-8”,
首选:“返回=最小”
}
}).done(函数(){
log(“上传完成,jqxhr:,jqxhr”);
成功回调(jqxhr);
}).失败(功能(错误){
console.log(“上传失败:+err.responseText”);
故障回调(jqxhr,err);
});
}
函数验证(端点、资源){
变量参数={
“资源类型”:“参数”,
“参数”:[{
“名称”:“资源”,
“资源”:资源
}]        
};
返回新承诺(功能(解决、拒绝){
log(“作出新承诺,解析函数为:”,解析);
log(“作出新承诺,拒绝函数为:”,拒绝);
上载(端点+'/'+resource.resourceType+“/$validate”、参数、解析、拒绝);
});

}
来解释@Jaromanda X在评论中所说的话

您正试图在另一个
承诺
中解析一个
承诺
。原始的
Promise
对象将不会传递给
的回调。相反,它将是原始
Promise
对象中的响应文本

在这种情况下,
jqxhr
是原始的
Promise
$.ajax
返回一个
Promise
对象),其响应文本是
。这就是为什么会得到一个空字符串

根据的文档,您的代码的工作原理与下面的示例相同

var original = Promise.resolve(true);
var cast = Promise.resolve(original);
cast.then(function(v) {
  console.log(v); // true
});
**更新日期:2016年11月14日


@Bergi指出,
jqxhr
不是
Promise
的一个实例,而是一个JQuery延迟对象,具有一个属性
then
(Promise-like)。但是,
Promise.then
将查找
jqxhr.then
,如果存在这样的属性,它将异步解析Promise。

通过验证函数返回jQuery Promise来修复它。

实际上,它没有变成两个空格,它变成了一个空字符串-这两个空格由console.log放在那里-尝试
typeof response
看看你在解析什么-
responseText
是一个空字符串,但是您的代码仍然应该解析为第27行记录的jqxhr对象。您应该在
上载
的内部创建
新承诺
,然后从那里返回
它,这样您就不必处理回调参数。抱歉,仍然感到困惑。我的上传没有失败,为什么响应文本会起作用?我也不是在upload()函数中返回jqxhr承诺,而是使用回调(因此承诺不会变得太复杂)。事实上,我没有说这一点-我不明白为什么OP在then中得到的是responseText,而不是解析的对象
jqxhr
@Vadi Yes,您没有返回
jqxhr
,而是返回
jqxhr。reponseText
将成为
中回调函数的参数,然后
<解析
jqxhr
后,调用code>successfulCallback(jqxhr)
。由于
jqxhr instanceof Promise===true
,因此
中的
response
参数的引用(function(response){…}
实际上是
jqxhr.reponseText
。检查这个@Z.Z.
jqXhr instanceof Promise
为false,但它是一个jQuery,使用
then
方法延迟,因此它将像promise@Bergi是的,我错了,会
Promise.resolve(jqxhr)
会将
jqxhr
解析为普通对象还是
Promise