AngularJs-factory:读取使用$resource获取的数据并返回其中的一部分

AngularJs-factory:读取使用$resource获取的数据并返回其中的一部分,angularjs,angular-resource,resolve,Angularjs,Angular Resource,Resolve,在我的工厂中,如何在从指令返回调用函数之前从.json文件中提取(读取)数据 这是我的工厂的定义 (function () { "use strict"; angular .module("common.services") .factory("langService", ["$resource", langService]) function langService($resource) { var langData

在我的工厂中,如何在从指令返回调用函数之前从.json文件中提取(读取)数据

这是我的工厂的定义

(function () {
    "use strict";

    angular
        .module("common.services")
        .factory("langService", ["$resource", langService])

    function langService($resource) {

        var langData = $resource('services/langInfo.json').query();

        function getInfo(language){
            /*look for a specific code from langData and return*/
        }

        return {
            getInfo: getInfo
        }
    }
}());
getInfo()是一个函数,用于从langData变量中查找适当的信息并返回它

以下是langInfo.json的json数据(尚未完成):

[{
  "marathi": { },
  "hindi": { },
  "konkani": { },
  "sanskrit": { },
  "gujarati": { }
}]
我对AngularJs不熟悉,因此需要帮助。我想当我试图用console.log打印langData时,它没有被解析,因此我无法访问它。这就是我得到的

console.log(langData)

:

顺便问一下,我想做的是可能的吗?怎么做

编辑:

根据Stian Sandve的回答,我在调用langService时传递了回调函数,如下所示:

langService.getInfo('langCode', function(data) {
    console.log(data);
});
并将getInfo的定义更改为

function getInfo(language, callback){
    langData.query(function(data) {
        var filteredData = filter(data); //assume filter() is defined
        callback(filteredData);
    });
}
所以我在回调函数中获取数据。但是我需要将它设置为在调用langService.getInfo之前声明的某个变量。比如说:

var langInfo
langService.getInfo('langCode', function(data) {
    console.log(data);
    //set data to langInfo
});

当您执行查询时,它会返回一个promise(您在控制台日志中看到的$promise)。实际上,promise包含返回的数据

var langData = [];
$resource('services/langInfo.json').query(function(data){langData = data;});
你可以期待等待一个承诺被执行,但是你会错过这个美丽的承诺

我要做的是:

$resource('services/langInfo.json').query(function(data){return data;});
然后在收到数据后进行过滤


或者,看看它在角度方面更像linq。

当您执行查询时,它会返回一个承诺(您在控制台日志中看到的$promise)。本质上,promise具有返回的数据

var langData = [];
$resource('services/langInfo.json').query(function(data){langData = data;});
你可以期待等待一个承诺被执行,但是你会错过这个美丽的承诺

我要做的是:

$resource('services/langInfo.json').query(function(data){return data;});
然后在收到数据后进行过滤


或者,看看它在角度方面更像linq。

在承诺得到解决后,您需要处理数据。根据AngularJS文件:

使用(value,responseHeaders)参数调用成功回调,其中值是填充的资源实例或集合对象。使用(httpResponse)参数调用错误回调

为了简化示例,我们不执行任何错误检查(只使用成功回调)

然后可以从指令中调用如下函数:

var response = {};
langService.getInfo('langCode', function(data) {
    console.log(data);
    response = data;
});

您需要在承诺得到解决后处理数据。根据AngularJS文件:

使用(value,responseHeaders)参数调用成功回调,其中值是填充的资源实例或集合对象。使用(httpResponse)参数调用错误回调

为了简化示例,我们不执行任何错误检查(只使用成功回调)

然后可以从指令中调用如下函数:

var response = {};
langService.getInfo('langCode', function(data) {
    console.log(data);
    response = data;
});

Angular是异步工作的,所以这不是它的工作方式。这里找到了一个关于如何在angular中加载json数据的好例子:angular是异步工作的,所以它不是这样工作的。在这里找到了一个关于如何在angular中加载json数据的好例子:您提到的第一件事不起作用。控制台仍然显示[]。第二件事我不明白;它将在哪里返回数据?如果您的意思是“var langData=$resource('services/langInfo.json').query(function(data){return data;});”那么这也不起作用尝试一下:var langData=[]$resource('services/langInfo.json').get(函数(数据){console.log(数据);langData=data;});那不行。正如Stian所解释的,我需要从调用“langService.getInfo”方法的地方传递一个回调函数。你提到的第一件事没有起作用。控制台仍然显示[]。第二件事我不明白;它将在哪里返回数据?如果您的意思是“var langData=$resource('services/langInfo.json').query(function(data){return data;});”那么这也不起作用尝试一下:var langData=[]$resource('services/langInfo.json').get(函数(数据){console.log(数据);langData=data;});那不行。正如Stian所解释的,我需要从调用“langService.getInfo”methodwait的地方传递一个回调函数。。在回调函数中,我得到了数据。但是如何将其设置为变量呢?假设变量是在调用api之前声明的。var反应;langService.getInfo('langCode',函数(数据){console.log(数据);});等待在回调函数中,我得到了数据。但是如何将其设置为变量呢?假设变量是在调用api之前声明的。var反应;langService.getInfo('langCode',函数(数据){console.log(数据);});