在异步函数调用之后,从工厂返回一个角度$资源

时间:2014-02-27 00:57:03

标签: javascript angularjs asynchronous

在异步函数调用后从工厂返回一个角度$资源。

下面显示了一个角度工厂的示例,我正在尝试返回$资源。

我正在尝试使用其他服务进行异步函数调用,以便在返回$ resource之前接收Web服务路径。

这可能吗?

angular.module('app').factory('newService', function($resource, configService) {
    configService.get(function(config) {
         return $resource(config.webServicePath + '/api/names', {},
             { 'update': { method:'PUT' } }
         );
    });
});

在异步函数调用之后,任何人都有一个服务,提供者或工厂返回资源的示例,以接收上述信息。

如果您可以提供控制器中使用的newService的示例,也会有所帮助。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

目前,这是回复resource的回调,这对你没有多大帮助。在异步函数完成之前,您不能延迟return语句,但是您可以使用$q promise。

ngular.module('app').factory('newService', function($resource, configService, $q) {
    var resourcePromise = $q.defer();
    configService.get(function(config) {
        resourcePromise.resolve($resource(config.webServicePath + '/api/names', {},
            { 'update': { method:'PUT' } }
        ));
    });
    return resourcePromise.promise;
});

以下是$q的工作原理

  1. 您需要返回将来获得的值,因此请使用$q.defer()
  2. 推迟它
  3. 这将返回一个延迟对象。
  4. 您进行异步调用,并在成功回调中,在延迟对象上调用.resolve
  5. 如果回调失败,则在延迟对象上调用.reject
  6. 您返回deferredobject.promise,这是一个承诺对象。
  7. 使用返回承诺的服务

    当您期望来自promise的值时,您可以通过将回调传递给其then方法来监听它。如果承诺可能被拒绝(操作失败),那么传递第二个回调是个好主意,当拒绝承诺时将调用该回调。

    这是一个返回承诺的服务的简单示例,以及如何使用它:

    http://jsfiddle.net/rP5Gh/