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
?