2015-07-21 23 views
0

我是一個新手,角度不夠強,而且在JavaScript中不太強大。我正在嘗試使用離子框架來製作應用程序。即時通訊嘗試從json文件中獲取列表。我已經成功地使用了變量中的原始json。但我現在試圖使用$http.get()從我的項目文件夾中的遠程文件中檢索它。

.service('staffServices', ['$q', '$http', staffService]); 

function staffService($q, $http) { 
    var staffs = {}; 
    var promise = $http.get("/js/jsons/settings.json") 
    .success(function(response) { 
    staffs = response.staffSettings; 
    console.log(staffs); //HAS WHAT I NEED 
    }); 
    console.log(staffs);  //EMPTY OBJECT 


    return { 
    loadAllSettings: function() {   
     return $q.when(staffs);   
    }, 
    query: function (params) { 
     return filterFilter(staffs, params); 
    }, 
    get: function (params) { 
     return this.query(params)[0]; 
    } 
    } 
}; 

出於某種原因,我不能.success()功能的外部訪問的結果。我不確定這是否是由於我對javascript或我的新手狀態的無知。請幫助我

這是我的控制器下面。 self.settings永遠不會被填充,總是返回一個空的對象

.controller("staffCtrl", function (staffServices) { 
    var self = this; 

    self.settings = []; 
    staffServices.loadAllSettings() 
    .then(function (settings) { 
    self.settings = [].concat(settings); 
    console.log(settings); 
    }); 
}); 
+0

您的代碼按預期工作。最後的日誌發生在promise被調用之前,所以對象仍然是空的。但是你的返回函數應該正確地處理響應數據(loadAllSettings,query) – Karmacon

+0

是的,我知道。但事實並非如此。沒有任何東西會在控制器上返回。我已經更新了問題以顯示我的控制器。 @karna –

回答

1

我相信問題是你如何處理$q和承諾,你也可以試試這個:

// Removed irrelevant return functions temporarily 
.service('staffServices', ['$q', '$http', staffService]); 

function staffService($q, $http) { 
    var deferredPromise = $q.defer(); 
    var staffs = {}; 
    var promise = $http.get("/js/jsons/settings.json") 
    .success(function(response) { 
     staffs = response.staffSettings; 
     console.log(staffs); 
     deferredPromise.resolve(staffs); 
    }) 
    .error(function(){ 
     deferredPromise.reject(); 
     console.log('Unsucessful json call'); 
    }); 

    return { 
     loadAllSettings: function() { 
      return deferredPromise.promise; 
     } 
    } 
}; 

.controller("staffCtrl", function (staffServices) { 
    var self = this; 
    self.settings = []; 
    staffServices.loadAllSettings() 
    .then(function (settings) { 
     console.log(settings); 
     self.settings = [].concat(settings); 
    }); 
}); 
+0

它的工作:)我不知道爲什麼。謹慎解釋? @walter –

+0

基本上你需要將異步調用保存在延期承諾中並返回。調用該函數後,您將收到該承諾,並且只有在承諾解決後(通過'.resolve()'或'.reject()'),'.then()'中的代碼纔會執行​​。實際上,我相信你甚至可以去掉staffService函數中的「promise」變量,直接調用$ http.get –

0

的$ http.get調用是異步的,所以當你調用.success回調內部的console.log,那statment實際上並沒有「發生」,直到$ http.get請求已解決。

第二次在.success語句之外調用console.log時,get請求尚未解析,因此staffs仍然是它在開始處的同一個空變量。

如果這個答案對你沒有意義,或者你不熟悉異步的東西,我可以推薦你檢查this question它很好地解釋異步調用。

至於JSON沒有正確返回,我認爲$ q.when(來自loadAllSettings()函數)應該返回一個promise,當它返回JSON對象staffSettings時。要對返回的語句使用.then調用,它需要是一個承諾。嘗試設置人員等同於響應,然後檢索控制器中的.staffSettings屬性。

.controller("staffCtrl", function (staffService) { 
    var self = this; 

    self.settings = []; 
    staffService.loadAllSettings() 
    .then(function (settings) { 
    self.settings = [].concat(settings.staffSettings); 
    console.log(settings); 
    }); 
}); 
+0

感謝您提出異步調用的想法。但該函數仍然不會返回json。有沒有什麼我應該做的,當它終於得到json運行?我已經更新了問題以顯示包含我的控制器也@turner –

+0

在我看其他解決方案之前嘗試一下就可以快速嘗試 - 您是否可以將'StaffServices'更新爲所有位置的'StaffService'(即在控制器和服務中) )並讓我知道如果這能解決它? 任何錯誤消息,你可以找到沿途也會有所幫助。 – turner

+0

我剛剛嘗試過同樣的事情。在控制檯中沒有任何錯誤 –