2014-02-06 82 views
0

如何在不发起http呼叫的情况下返回承诺? ATM我有一些模拟JSON将被API调用所取代。

+0

return $ q.when(json); – Stewie

+0

@Stewie感谢,但就是这个不错的方法我真正的上游来电将被期待同样的JSON结果为$ http.get( – FutuToad

+0

$ HTTP服务返回的响应对象,以'data'持有物业的实际JSON,所以你只需要把你的json换成简单的对象:'$ q.when({data:})'; – Stewie

回答

2

下面是一个完整的例子。注意我们使用$ q来获得延期,做一些有趣的事情,然后用“决心”发送决赛。我像使用$ http一样使用JSON,并使用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秒后,将更新到服务的结果呼叫。

+0

真棒的东西谢谢! – FutuToad

0

试试这个

return $q.defer().promise 

你可以做

var promise = $q.defer().promise; 
promise.then(success,error) 
return promise; 
+0

对不起,为什么第二个方法在这里? – FutuToad

+1

第一个只是按照你的要求返回一个promise,第二个也是定义回调诺言 – doodeec

0

这应该可能是一个评论,但我经常看到这一点,认为这是不好的做法,尤其是关于像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/(我偷了大部分来自杰里米Likness的回答以上)。

恕我直言,这是最好的方式来做到这一点,因为它是干净的,可能是最短的办法。 (json);