【问题标题】:Review of Promise object in Angular回顾 Angular 中的 Promise 对象
【发布时间】: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


【解决方案1】:

$http 服务在您调用 get 方法时已经返回了一个承诺。你可以做return $http.get...。然后在您的控制器中,您将能够在方法调用之后添加thensuccesserror

【讨论】:

  • 对不起,重点不是怎么用的。关键是为什么第一个代码应该在没有 defer 和 resolve 的情况下工作?
  • Sébastien 回答的要点是“当您调用 get 方法时,$http 服务已经返回了一个承诺”,这足以证明问题的第一个代码块优于第二个。
猜你喜欢
  • 2014-03-07
  • 2017-04-03
  • 2020-02-28
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 2018-01-20
  • 2020-04-30
  • 2022-01-01
相关资源
最近更新 更多