AngularJS Promises - 模拟http承诺

时间:2013-08-14 22:19:37

标签: angularjs promise

当我知道请求在服务器端失败时,我想知道如何模拟promise $ http。这是我的代码:

if ( !ng.isString(email) ) {
    var promise = $q.defer().promise;
    $q.reject();

    return promise;
}

return $http( {
         method : "PUT",
         url : "//localhost/update" ,
         data : { data: email } 
})

// Success handler
.success(response){ return response})

// Error handler
.error(errorMsg){ return errorMsg});

6 个答案:

答案 0 :(得分:5)

您可以使用resolve和reject来控制数据流:

假设你有这样的服务:

var app = angular.module("mymodule.services", []);

app.factory("HttpRequest", ['$q', '$http', function(q, http) {
  var deferredData = q.defer();

  http.get('http://your-server.local/data.json').success(function(data) {
    //success, resolve your promise here
    deferredData.resolve(data);
  }).error(function(err) {
    //error, use reject here
    deferredData.reject(err);
  });

  return {
    get: function() {
      return deferredData.promise;
    }
  };
}]);

然后可以使用该服务:

var app = angular.module("mymodule.controllers", ['mymodule.services']);

app.controller("MyCtrl", ['HttpRequest', '$scope', function(res, scope) {
  //the "then"-method of promises takes two functions as arguments, a success and an erro callback
  res.get().then(function(data) {
    //first one is the success callback
    scope.data = data;
  },
  function(err) {
    scope.err = err; 
  }); 
}]);

您可以在第二次回调中处理错误。

答案 1 :(得分:5)

好的,我可以弄清楚如何模拟$ http对象返回的相同承诺。感谢大家的回答。我可以把它们都考虑进去。这是我的解决方案:

if ( !ng.isString(email) ) {

    // We need to create a promise like the one returned by the 
    // $http object (with the success and error methods)
    // to stay consistent.
    var promise = $q.reject("error with email");

    // Defining success and error method for callbacks. 
    // but it should never be called since the promise 
    // is already rejected.
    promise.success = function(fn){
       promise.then(function(response){
          fn(response)
       }, null);
          return promise
    };

    promise.error = function(fn){
       promise.then(null, function(response){
          fn(response)
       });
       return promise;
    };

    return promise;
}

return $http( {
         method : "PUT",
         url : "//localhost/update" ,
         data : { data: email } 
})

// Success handler
.success(response){ return response})

// Error handler
.error(errorMsg){ return errorMsg});

答案 2 :(得分:3)

$http在angularJS中返回一个承诺。你可以这样做:

var promise = $http(...) ;
promise.then(function(data) {}, function(error){});

您可以在jQuery ajax调用中查找成功和错误函数,但在angularJS中可以使用不同的东西。您可能需要遵循它才能使其正常工作。

您可以告诉我们更多关于您为什么需要使用成功和错误的原因,以便我们找到一种方法使其适用于您的案例。

答案 3 :(得分:1)

这样的事情应该有效:

if ( !ng.isString(email) ) 
    return $q.reject("Email is invalid.");  // returns rejected promise

return $http( {
         method : "PUT",
         url : "//localhost/update" ,
         data : { data: email } 
});

然后在您的代码中将其用作常规承诺

mypromise.then(function(x) { do something with x.data }, function(error) { alert(error)});

答案 4 :(得分:1)

使用下面的建议(并调试Angularjs代码),我找到了一种允许拒绝或解决的更简化的方法。

if (alreadyLoaded){
    var defered = $q.defer();
    defered.success = function(fn){
        defered.promise.then(fn);
        return defered;
    };
    defered.error = function(fn){
        defered.promise.then(null, fn);//or defered.promise.catch(fn)
        return defered;
    };
    if(data.invalid)
        defered.reject("arbitrary error");
    else
        defered.resolve(data);
    return defered;
}else {
    return $http.get(...);
}

successerror方法返回this以允许排队回调)

答案 5 :(得分:0)

你的语法有点搞砸了。试试这个:

var deferred = $q.defer();
$q.reject();
return deferred.promise;