如何在不拨打http电话的情况下返回承诺? ATM我有一些模拟JSON,将被API调用取代。
答案 0 :(得分:2)
这是一个完整的例子。请注意,我们使用$ q来获取延迟,做一些有趣的事情,然后使用“resolve”发送最终结果。我正在使用JSON就像$ http一样,并使用JSON过滤器来显示它。
代码:
var app = angular.module("myApp", []);
app.service("myService", function($q, $timeout) {
return {
getData: function() {
var deferral = $q.defer();
$timeout(function() {
deferral.resolve({
id: 1,
status: "Returned from service.",
promiseComplete: true });
}, 2000);
return deferral.promise;
}
};
});
app.controller("myController", function($scope, myService) {
var result = { status: "Initialized." };
$scope.result = result;
myService.getData().then(function(data) { $scope.result = data; });
});
工作小提琴:http://jsfiddle.net/jeremylikness/HL7h2/
当你运行它时,你会在输出中看到一个JSON项,然后大约2秒后它将更新为服务调用的结果。
答案 1 :(得分:1)
这应该是一个评论,但我经常看到这一点并认为这是不好的做法,特别是关于DRY和KISS等原则。
$timeout()
将返回一个承诺。你不需要自己制作一个。这意味着,为了模拟$http
请求,您可以简单地编写如下内容:
var promise = $timeout(function () {
return {
data: // some data
}
});
promise.then(function (response) {
// do whatever you like
});
这是一个修改过的小提琴:http://jsfiddle.net/1vgs7nbj/1/(我从上面的Jeremy Likness的答案中偷走了大部分内容)。
恕我直言,这是最好的方法,因为它很干净,可能是最短的方法。答案 2 :(得分:0)
试试这个
return $q.defer().promise
你可以做到
var promise = $q.defer().promise;
promise.then(success,error)
return promise;