【问题标题】:AngularJs - Share data across multiple functions inside factoryAngularJs - 在工厂内的多个功能之间共享数据
【发布时间】:2016-08-11 05:38:06
【问题描述】:

我刚开始学习 Angularjs,所以我可能用错了,但请纠正我。

我有以下这样的工厂:

app.factory('MenuService',['service1','service2','service3',function(service1,service2,service3){

    var var1 = [],
        var2 = [],
        var3 = [];

    service1.getDataMethod(function(data){
        // processes data and saves it in var1
    });

    service2.getDataMethod2(function(data)){

    });

    /// same goes for service3.

    return {"prop2": var1, "prop2" : var2, "prop3": var3};
}])

我需要根据第一个服务返回的数据处理 service2 返回的数据,但每次我尝试访问它时,变量都是空的。

我知道函数返回一个承诺,有没有办法告诉第二个函数等待第一个函数完成以便能够使用它带来的数据?

我希望我能理解自己。让我知道我是否应该添加其他内容。

【问题讨论】:

标签: javascript angularjs promise angular-promise


【解决方案1】:

像这样?

service1.getDataMethod(function(data){
     // processes data and saves it in var1
}).then(function(data) {
  return service2.getDataMethod2(data)
})

基本上每个promise都有.then()方法。所以你可以根据需要链接它a.then().then().then()

此外,一些 Promise 实现具有方法包装器,例如 .success().error()。这些方法的工作原理类似于.then()

【讨论】:

  • 嘿!感谢您的答复。我用 .then(...) 尝试过,但出现以下控制台错误:“service1.getDataMethod(...).then”不是函数
  • @IvanSt 在这种情况下,请确保 getDataMethod() 返回承诺
  • getDataMethod(function(data){....}) data 参数包含 getDataMethod 返回的数据及其包含数据的已解析承诺。处理后它被保存在 var1 中,但是当我尝试从 service2.getDataMethod2 访问它来处理它时,变量是空的。
【解决方案2】:

在 Angular 中,您可以访问 $q 服务,该服务是与 Promise 一起使用的 q 库的实现。 https://docs.angularjs.org/api/ng/service/$q 如果您出于某种原因不喜欢它,请尝试async

【讨论】:

    【解决方案3】:

    基本上你必须链接你的承诺:

    service1.getDataMethod(function(data){
        return something; // this is important, only that way you will be
                          // able to use the next .then()
    })
    .then(function(something) { // what you returned previously will be the function's argument
    
        return service2.getDataMethod2(data);
    })
    .then(function(result) { // `result` is what getDataMethod2 resolves
    
    })
    .catch(function(err) {
        // very important to add .catch to handle errors
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多