簡體   English   中英

函數不同步返回值

[英]Function not returning value synchronously

我有以下情況,其中syncAnalytics調用syncAnalytics 在此函數內,還有另一個函數retreiveAnalyticsData ,用於檢索本地存儲的數據。

但是,從返回的值前retreiveAnalyticsData ,函數的其余部分syncAnalytics得到執行。

DemoModule.factory('ApplicationAnalytics', function ($http, $location, DBO) {
    return {
        syncAnalytics: function () {
            console.log("syncAnalytics called");// Getting displayed 1st
            // Retrieve analytics data available data from db
            var inputData = this.retreiveAnalyticsData();
            console.log("Input Data : " + JSON.stringify(inputData)); // Getting displayed 4th
        },    
        retreiveAnalyticsData: function () {
            console.log('retreiveAnalyticsData called');// Getting displayed 2nd
            // Select all rows from app_analytics table in db
            var selectQuery = "SELECT * FROM app_analytics";
            var analyticsData = [];
            DBO.execQry(selectQuery, function (results) {
                var len = results.rows.length,
                    i;
                for (i = 0; i < len; i++) {
                    analyticsData.push(results.rows.item(i).text);
                }
                console.log(analyticsData); //Getting displayed 5th
                return analyticsData;
            });
            console.log('retreiveAnalyticsData ended');// Getting displayed 3rd
        }
    };
});

所以基本上:

var inputData = this.retreiveAnalyticsData(); //This should be executed before the below line.
console.log("Input Data : " + JSON.stringify(inputData)); // Getting displayed 4th

任何見識將不勝感激。

注意:我正在使用AngularJS

DBO.execQry是一個異步函數。 您可能會因為回調模式而看到這種情況-例如execQry的第二個參數是一個函數,如果execQry准備好檢索數據,則會調用該函數。 我想您會看到的是console.log('retreiveAnalyticsData end'); 在console.log(analyticsData);之前打印出來;

如何處理呢?

1)以前的方法是使用回調函數:

syncAnalytics: function () {
   this.retreiveAnalyticsData(function(inputData){
      console.log("Input Data : " + JSON.stringify(inputData)); 
   });
}, 

retreiveAnalyticsData: function (callback) {
   var selectQuery = "SELECT * FROM app_analytics";
   var analyticsData = [];
   DBO.execQry(selectQuery, function (results) {
      var len = results.rows.length,
      for (var i = 0; i < len; i++) {
         analyticsData.push(results.rows.item(i).text);
      }
      callback(analyticsData);
   });
}

但是這種方式有很多缺點。 如果您想處理錯誤或需要進行多個異步調用或將它們同步在一起怎么辦? 因此,我們來到了承諾模式。

2) $ q的承諾模式

syncAnalytics: function () {
   this.retreiveAnalyticsData().then(function(inputData){
         console.log("Input Data : " + JSON.stringify(inputData)); 
   });
}, 

retreiveAnalyticsData: function () {
   var selectQuery = "SELECT * FROM app_analytics";
   var analyticsData = [];
   var deferred = $q.defer();
   DBO.execQry(selectQuery, function (results) {
      var len = results.rows.length,
      for (var i = 0; i < len; i++) {
         analyticsData.push(results.rows.item(i).text);
      }
      deferred.resolve(analyticsData);
   });
   return deferred.promise;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM