【发布时间】:2015-12-10 00:06:41
【问题描述】:
好的,我有以下代码
Load: function (urlInfo, moduleInfo) {
return (function() {
var paramsObj = CheckParams(urlInfo.params);
if (paramsObj != null)
return $http.get(urlInfo.url, { params: paramsObj, cache: $templateCache });
else
return $http.get(urlInfo.url, { cache: $templateCache });
}()).then(this.successFn, this.errorFn);
},
successFn: function (response) {
if (response) {
return response;
} else {
// invalid response
return $q.reject(response);
}
},
errorFn: function (response) {
// something went wrong
return $q.reject(response);
},
我认为上面的代码有问题,因为它没有使用承诺 并且不要使用延迟对象,也不要解析对象 我认为代码必须像这样审查:
GetData: function (urlInfo) {
return function () {
var deferred = $q.defer();
var paramsObj = CheckParams(urlInfo.params);
if (paramsObj != null){
$http.get(urlInfo.url, { params: paramsObj })
.success(function (data, status, headers, config) {
//resolve the promise
deferred.resolve(data); //#1
})
//if request is not successful
.error(function (data, status, headers, config) {
//reject the promise
deferred.reject('ERROR');
});
}
return deferred.promise;
}()).then(function (resolve) {
return resolve;
}, function (reject) {
return reject;
});
}
因为我不是专家,你可以告诉我会出现什么问题 使用第一个代码(如果有问题)
【问题讨论】:
-
@thefourtheye 提到的
Promise.resolve函数与您认为的deferred.resolve()调用不同。.then(…)返回的承诺由then的代码在内部解决,因此您不必显式执行此操作。仅仅因为你没有在任何地方看到“解决”这个词并不意味着承诺不会得到实现。 -
不,
Promise.resolve(x)只是替换new Promise((s,e) => { x.then(s, e); })/var d=defer(); x.then(d.resolve,d.reject); x.promise的正确模式。如果您想对数据做任何事情,您仍然需要对它进行适当的、常规的.then(…)调用。在您的情况下,它将是$q.when($http.get(…))($q.when~Promise.resolve用于角度承诺),但这毫无意义,因为$http.get已经返回了角度承诺。 -
@TomG 如果我正确阅读了问题和 cmets,它不会按预期工作。在 Code Review 中,损坏的代码绝对是题外话。
-
@Mast:实际上这更像是一个错字。我现在已经修好了。
标签: javascript angularjs promise