如何修复我的承诺返回此处的功能?

时间:2015-10-07 15:28:49

标签: javascript angularjs promise angularjs-service

我有一个tags数组,最多可包含3个项目。

接下来,我将tags传递给我的getTagQuotes函数,并尝试为其设置一个promise变量。 现在我的承诺未定义。

enter image description here

// If there are tags, the wait for promise here:
if (tags.length > 0) {
    var promise = getTagQuotes(tags).then(function() {
        console.log('promise =',promise);

        for (var i=0; i<tweetArrayObjsContainer.length; i++) {
            chartObj.chartData.push(tweetArrayObjsContainer[i]);
        }

        chartDirective = ScopeFactory.getScope('chart');
        chartDirective.nvd3.drawChart(chartObj.chartData);
    });
}
else {
    chartDirective = ScopeFactory.getScope('chart');
    chartDirective.nvd3.drawChart(chartObj.chartData);
}

^上面的目标是在绘制tweetArrayObjsContainer图表之前确保chartObj.chartData中的数组已填充并推送到nvd3

下面是我的getTagQuotes函数,它通过标记执行另一个循环(最多3个)并调用另一个服务GetTweetVolFactory.returnTweetVol,这使得实际的API调用可以检索数据。

我有代码检查我们是否在最后一个循环步骤,然后调用formatTagData函数。

formatTagData内,我填充了tweetArrayObjsContainer

// Check for and GET tag data:
////////////////////////////////////////////////////////////////////
function getTagQuotes(tags) {
    console.log('getTagQuotes called with',tags);
    var deferred   = $q.defer(); // <- setting $q.defer here
    var url        = 'app/api/social/twitter/volume/';

    for (var i=0; i<tags.length; i++) {
        var loopStep = i;
        rawTagData   = [];

        GetTweetVolFactory.returnTweetVol(url+tags[i].term_id)
            .success(function(data, status, headers, config) {
                rawTagData.push(data);

                if (loopStep === (rawTagData.length - 1)) {
                    // formatTagData fills the tweetArrayObjsContainer with data:
                    formatTagData(rawTagData);
                    deferred.resolve(); // <-- last step, so resolve
                    return deferred.promise;
                }
            })
            .error(function(data, status) {
                return 'error in returning tweet data';
            });
    }

    function formatTagData(rawData) {
        tweetArrayObjsContainer = [];

        for (var i=0; i<rawData.length; i++) {
            var data_array = [];
            var loopNum = i;

            _(rawData[i].frequency_counts).reverse().value();

            for (var j=0; j<rawData[loopNum].frequency_counts.length; j++) {
                var data_obj = {};
                rawData[loopNum].frequency_counts[j].start_epoch = addZeroes(rawData[loopNum].frequency_counts[j].start_epoch);
                data_obj.x = rawData[loopNum].frequency_counts[j].start_epoch;
                data_obj.y = rawData[loopNum].frequency_counts[j].tweets;
                data_array.push(data_obj);
            }

            var tweetArrayObj = {
                "key"    : "Quantity"+(i+1),
                "type"   : "area",
                "yAxis"  : 1,
                "color"  : tagColorArray[i],
                "values" : data_array
            };

            tweetArrayObjsContainer.push(tweetArrayObj);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您的getTagQuotes函数应使用$q服务check it out返回承诺。

它应该是这样的:

function getTagQuotes(tags) {
    var deferred = $q.defer();

    (...)
    // When the action is finished here, call resolve:
    deferred.resolve();
    (...)

    // And in the end, return the promise
    return deferred.promise;
}

最后,在您的主要代码中,您将:

var promise = getTagQuotes(tags).then(function(){
    console.log('promise =',promise);
    // Fill chartObj with tweet data arrays
    (...)
});

答案 1 :(得分:1)

此函数没有返回语句。

function getTagQuotes(tags)