【问题标题】:Return an angular $resource from a factory after an asynchronous function call在异步函数调用后从工厂返回一个角度 $resource
【发布时间】:2014-03-30 04:42:06
【问题描述】:

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

下面显示了一个角度工厂的示例,我在其中尝试返回 $resource。

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

这可能吗?

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

有没有人能举例说明服务、提供者或工厂在异步函数调用后返回资源以接收上述信息。

如果您能提供一个在控制器中使用的 newService 的示例,也会很有帮助。

提前感谢您的帮助。

【问题讨论】:

  • "return" 和 "asynchronous" 通常不会混用。您希望使用 Promise 和回调。 Angular 有一个名为$q 的服务,请参阅docs.angularjs.org/api/ng/service/$q。大多数角度请求已经返回承诺。

标签: javascript angularjs asynchronous


【解决方案1】:

目前,它是返回 resource 的回调,这对您没有多大帮助。您不能在异步函数完成之前延迟返回语句,但您可以使用 $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. 您进行异步调用,并在其成功回调中调用延迟对象上的.resolve。
  4. 如果回调失败,则在延迟对象上调用.reject。
  5. 你返回deferredobject.promise,这是一个promise对象。

使用返回承诺的服务

当你期望一个 Promise 的值时,你可以通过将回调传递给它的 thenmethod 来监听它。如果 promise 可能被拒绝(操作失败),最好传递第二个回调,该回调将在 promise 被拒绝时调用。

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

http://jsfiddle.net/rP5Gh/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2017-10-18
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    相关资源
    最近更新 更多