在没有进行角度$ http呼叫的情况下返回承诺?

时间:2014-02-06 13:57:56

标签: angularjs http promise

如何在不拨打http电话的情况下返回承诺? ATM我有一些模拟JSON,将被API调用取代。

3 个答案:

答案 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;