Javascript AngularJS-无法获得$q.reject并开始工作

Javascript AngularJS-无法获得$q.reject并开始工作,javascript,ajax,angularjs,promise,angular-promise,Javascript,Ajax,Angularjs,Promise,Angular Promise,看看我的代码示例: 我已经把它精简到(我认为是)最基本的部分,我正在设置一个错误延迟。拒绝不是一个函数 angular .module('myApp') .service('myService', MyService); MyService.$inject = ['$http', '$q']; function MyService($http, $q) { var self = this; self.getResult = getResult; f

看看我的代码示例:

我已经把它精简到(我认为是)最基本的部分,我正在设置一个错误
延迟。拒绝不是一个函数

angular
    .module('myApp')
    .service('myService', MyService);

MyService.$inject = ['$http', '$q'];

function MyService($http, $q) {
    var self = this;

    self.getResult = getResult;

    function getResult(id) {
        var deferred = $q.defer();

        deferred = $http.get('my/api/method', { params: { id: id } })
            .then(getResultCompleted)
            .catch(getResultFailed);

        function getResultCompleted(response) {
            if (response.data.ID > 0) {
                deferred.resolve(response.data);
            } else {
                deferred.reject(response);
            }
        }

        function getResultFailed(response) {
            deferred.reject(response);
        }

        return deferred.promise;
    }
}
注意:我知道我可以通过简单地返回$http调用的结果来实现这一点,但是为了理解这些promise对象,我想看看是否可以通过如上所示声明并返回
deferred
来实现这一点


谢谢

您正在创建自定义承诺并从您的方法返回它,但这意味着在处理它时,您正在使用
$http.get
覆盖
延迟的
(自定义承诺对象),该方法还返回具有
的承诺。然后
.catch
方法(没有
resolve
reject
方法)。由于该赋值,您无法从
延迟的
对象访问
.resolve
.reject

deferred = $http.get('my/api/method', { params: { id: id } })
应该只有

$http.get('my/api/method', { params: { id: id } })
由于
$http.get()
返回承诺且成功回调支持链接API,因此您可以在回调中定义新的延迟对象并从中返回:

angular
    .module('myApp')
    .service('myService', MyService);

MyService.$inject = ['$http', '$q'];

function MyService($http, $q) {
    var self = this;

    self.getResult = getResult;

    function getResultCompleted(response) { // Tip: Define callback outside of getResult in order to avoid creating new instance of it each time getResult is called
        var deferred = $q.defer();
        if (response.data.ID > 0) {
            deferred.resolve(response.data);
        } else {
            deferred.reject(response);
        }
        return deferred.promise;
    }

    function getResult(id) {
        return $http.get('my/api/method', { params: { id: id } })
            .then(getResultCompleted);
    }
}
注意,不再有错误回调(只是因为在本例中它是冗余的)


如果请求失败,将返回来自
$http.get()
的原始拒绝承诺,否则将使用来自success回调的全新承诺进行后续
.then()
调用。

$http.get()
返回承诺,但不返回deferred@Vadim:我不明白。你能帮我翻译一下吗?我指的是
deferred=$http.get()
string。这是不正确的,因为
$http.get()
返回的不是延迟对象,而是promise。因此,您可以只返回
$http.get
谢谢@PankajParkar。我还是有点不清楚。如果给它赋值$http.get的返回结果,这是否意味着它接受了值?@Ricky不……promise不是这样工作的。promise的意思是你说的,我是说的有东西要返回&过一段时间我会得到它..这就是为什么您创建了
var deferred=$q.defer();
并且当您收到一个响应时,您使用数据
resolve
reject
和相同的数据..如果您这样做
deferred=$http.get('my/api/method',{params:{id:id})
在它之间..它将刷新整个对象传统的
$http.get
promise对象将引入其中..谢谢@Vadim.
延迟的
赌注将在哪里声明?我在您的代码中没有看到它(尽管可能我错过了它)@瓦迪姆:我不明白你为什么在返回
$http.get
promise时使用
延迟的
对象already@PankajParkar一旦承诺得到解决,您就不能再拒绝它了。由于
$http
中的原始承诺已经得到解决,并且您需要在特定条件下拒绝它,因此您需要创建new promise,为此您需要新的延迟。@Vadim您确定吗?这不像您在思考,因为您返回了像
return$http.get('my/api/method',{params:{id:id}})这样的承诺
行,应该是
延迟返回。承诺
成功working@PankajParkar看看这个plunk:。要了解它是如何工作的,您可以使用
$http.get()的URL