有没有一种方法可以返回一个 HttpPromise(或类似的东西)来模仿调用 $http?我想要设置一个全局变量,指示是否进行了真正的 HTTP 请求,或者是否返回了一个带有虚假数据的假 HttpPromise 对象。
例如,我有一个类似于以下代码的服务:
angular
.module('myservice')
.factory('MyService', ['$http', function($http) {
return {
get : function(itemId) {
if (isInTestingMode) {
// return a promise obj that returns success and fake data
}
return $http.get("/myapp/items/" + itemId);
}
};
} ]);
在我的控制器中,我调用上述服务的方法看起来类似于这样:
// Somewhere in my controller
MyService.get($scope.itemId)
.success(function(data) {
$scope.item = data;
})
.error(function(data, status, headers, config) {
$scope.notFound = true;
});
我试图不改变控制器代码;当在“isInTestMode”时,我希望“success”和“error”链接仍然可以工作。是否可能以我在服务中描述的方式伪造一个“HttpPromise”?
以下是上面“MyService”的修订版(片段),包含 promise 对象上的“success”和“error”。但是,如何执行“success”方法?
return {
get : function(itemId) {
if (isInTestingMode) {
var promise = $.defer().promise;
// Mimicking $http.get's success
promise.success = function(fn) {
promise.then(function() {
fn({ itemId : "123", name : "ItemName"}, 200, {}, {});
});
return promise;
};
// Mimicking $http.get's error
promise.error = function(fn) {
promise.then(null, function(response) {
fn("Error", 404, {}, {});
});
return promise;
};
return promise;
}
return $http.get("/myapp/items/" + itemId);
}
}
deferred.resolve(result)
,然后返回 Promise,如果你想模拟成功... 或者设置deferred.reject(error)
如果你想模拟失败。 - KnFdeferred.promise
没有像$http一样提供success()
和error()
来进行链式调用。请参考此答案的示例以了解如何实现 - https://dev59.com/1GIj5IYBdhLWcg3w8JNZ#19747182。 - Ilia Barahovskysuccess()
和error()
已经不再使用。 Promises提供了更强大的then(success, error)
结构,可以无限链接。 请参阅https://docs.angularjs.org/api/ng/service/$q - domokunfakeHttpCall(true).success()
的调用。这应该会失败,因为fakeHttpCall
返回的是deferred.promise
。后者确实定义了then()
,正如您在评论中提到的那样,但没有定义success()
。 - Ilia Barahovsky