2014-02-14 53 views
2

我有以下条件首先调用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

回答

3

DBO.execQry是一个异步函数。你可能会看到这个,因为回调模式 - 例如execQry的第二个参数是一个在execQry准备好检索数据时调用的函数。我想你看到的是,console.log('retreiveAnalyticsData结束');在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; 
} 
+0

真棒..将检查了这一点,让你KNW .. –