2014-12-01 52 views
0

我有以下函數工作正常,直到我試圖從此assync函數調用另一個assync請求。如果我試過它輔助assync函數總是返回異常。如果從assync請求調用assync請求,那麼Angular沒有方法'then'

「有博法‘那麼’」

有沒有人知道是什麼導致可以,而我怎麼能解決呢普萊舍?

感謝您的任何幫助。

首先assync功能

$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; 

}; 

二assync服務功能:

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 
+1

指出代碼中您遇到問題的位置會非常有幫助。 – 2014-12-01 20:05:47

+0

我解決了關於錯誤發生的代碼片段的問題。 – redrom 2014-12-01 20:09:07

回答

1

您的異步功能computeSuccessRateSinceStart是一個函數,所以你需要把它調用一個函數,並將它傳遞一個行作爲一個參數:

DialsComputeService.computeSuccessRateSinceStart(yourRow).then(...) 

一旦你這樣做,從函數的返回值將是一個承諾,它有一個then()方法。