Angular没有方法'然后'如果从assync请求调用assync请求

时间:2014-12-01 20:03:38

标签: angularjs asynchronous angular-promise

我有以下功能正常工作,直到我试图从此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

1 个答案:

答案 0 :(得分:1)

您的异步函数computeSuccessRateSinceStart是一个函数,因此您需要将其作为函数调用并将其作为参数传递给它:

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

一旦你这样做,函数的返回值将是一个promise,它有一个then()方法。