我有以下功能正常工作,直到我试图从此assync函数调用另一个assync请求。如果我尝试了它,辅助同步功能总是返回异常。
“有bo方法'然后'”
有没有人知道是什么导致它?我怎么能解决它呢?
感谢您的帮助。
第一次同步功能
$scope.getData = function() {
var deferred = $q.defer();
var DATE_FROM = dateFrom;
var DATE_TO = dateTo;
// INSTANTIATE DB CONNECTION
db = window.sqlitePlugin.openDatabase({name:"callplanner"});
var numberOfProcessed = 0;
for(var ic=0; ic < dateRanges.length; ic++) {
var sqlQuery =
"SELECT '"+dateRanges[ic].DATE_FROM+"' as DATE_FROM, "+
" '"+dateRanges[ic].DATE_TO+"' as DATE_TO, "+
" COUNT(*) AS DIALS_CNT, "+
" SUM(CASE WHEN dc.call_result = '"+CALL_RESULT_STATE_APPT+"' THEN 1 ELSE 0 END) AS '"+APPT_CNT+"', "+
" SUM(CASE WHEN dc.call_result = '"+CALL_RESULT_STATE_CONV_NO_APPT+"' THEN 1 ELSE 0 END) AS '"+CONVERS_CNT+"' , "+
" SUM(CASE WHEN dc.call_result = '"+CALL_RESULT_STATE_CANNOT_REACH+"' THEN 1 ELSE 0 END) AS '"+CANNOT_REACH_CNT+"' "+
" FROM "+DIALED_CALLS_TABLE+" dc "+
" WHERE dc.date BETWEEN '"+dateRanges[ic].DATE_FROM+"' AND '"+dateRanges[ic].DATE_TO+"';";
// PRINT QUERY
console.log(sqlQuery);
// PUSH QUERY TO ARRAY
sqlQueries.push(sqlQuery);
// PROCESS TRANSACTION
db.transaction(function(tx) {
// init empty array for results
tx.executeSql(sqlQueries[numberOfProcessed], [], function(tx,results){
for (var i=0; i < results.rows.length; i++){
//process your result from sql
numberOfProcessed++;
row = results.rows.item(i);
// Replace null values
if(row.APPT_CNT == null)
row.APPT_CNT = 0;
if(row.CONVERS_CNT == null)
row.CONVERS_CNT = 0;
if(row.CANNOT_REACH_CNT == null)
row.CANNOT_REACH_CNT = 0;
// End of replacing null values
row.YOUR_GOAL = $rootScope.goalValue;
row.YOUR_DEFICIT = DialsComputeService.computeDailyDeficit(row);
row.SUCCESS_RATE = DialsComputeService.computeSuccessRateDaily(row);
//row.SUCCESS_RATE_SINCE = DialsComputeService.computeSuccessRateSinceStart(row);
// GET DATA IN ASSYNC TASK
DialsComputeService.computeSuccessRateSinceStart.then(function(result){
// THIS GIVES THE VALUE:
//alert("Result is" + JSON.stringify(result));
console.log("Returned Result is: " + JSON.stringify(result));
try{
row.SUCCESS_RATE_SINCE = result;
} catch (e) {
$ionicLoading.show({
template: $translate.instant('ERROR'),
duration:1000
});
}
}, function(e){
$ionicLoading.show({
template: $translate.instant('ERROR_DATABASE'),
duration:1000
});
});
// END GET DATA IN ASSYNC TASK
statsData.push(row);
console.log("Result row is: " + JSON.stringify(row));
if(numberOfProcessed == dateRanges.length){
deferred.resolve(statsData); // resolve your promise when you are sure you handled everything
}
}
});
},function (e) {
alert("ERROR: " + e.message);
deferred.reject(e);
});
}
return deferred.promise;
};
服务中的第二个同步功能:
computeSuccessRateSinceStart: function(row) {
var deferred = $q.defer();
console.log("Trying to compute daily success rate since until" +row.DATE_TO);
var sqlQuery =
"SELECT " +
"("+
"SELECT COUNT(*) "+
"FROM dialed_calls AS dc "+
"WHERE dc.date < '"+row.DATE_TO+"'" +
") " +
"AS DIALS_CNT ," +
"("+
"SELECT COUNT(dc.call_result) "+
"FROM dialed_calls AS dc "+
"WHERE dc.call_result = 'APPT_CNT' "+
"AND "+
"dc.date < '"+row.DATE_TO+"'" +
") " +
"AS APPT_CNT ;";
console.log(sqlQuery);
db = window.sqlitePlugin.openDatabase({name:"callplanner"});
// GET APPT COUNT
db.transaction(function(tx) {
tx.executeSql(sqlQuery, [], function(tx,results){
// init empty array for results
for (var i=0; i < results.rows.length; i++){
row = results.rows.item(i);
//Udpate date for writeout
//row.DATE = moment(row.DATE).format('ddd DD.M');
console.log("row APPT count is " + JSON.stringify(row));
alert(JSON.stringify(row));
var successRateFromSince;
successRateFromSince = row.APPT_CNT / row.DIALS_CNT * (100);
successRateFromSince = Math.round(successRateFromSince);
if(isNaN(successRateFromSince)) {
successRateFromSince = 0;
}
console.log("Success rate since is " +successRateFromSince);
}
deferred.resolve(successRateFromSince);
});
},function (e) {
alert("ERROR: " + e.message);
$ionicLoading.show({
template: $translate.instant('ERROR_DATABASE'),
duration:1000
});
});
return deferred.promise;
}
};
发生错误的地方:
// GET DATA IN ASSYNC TASK
DialsComputeService.computeSuccessRateSinceStart.then(function(result){
// THIS GIVES THE VALUE:
//alert("Result is" + JSON.stringify(result));
console.log("Returned Result is: " + JSON.stringify(result));
try{
row.SUCCESS_RATE_SINCE = result;
} catch (e) {
$ionicLoading.show({
template: $translate.instant('ERROR'),
duration:1000
});
}
}, function(e){
$ionicLoading.show({
template: $translate.instant('ERROR_DATABASE'),
duration:1000
});
});
// END GET DATA IN ASSYNC TASK
答案 0 :(得分:1)
您的异步函数computeSuccessRateSinceStart
是一个函数,因此您需要将其作为函数调用并将其作为参数传递给它:
DialsComputeService.computeSuccessRateSinceStart(yourRow).then( ... )
一旦你这样做,函数的返回值将是一个promise,它有一个then()方法。