【问题标题】:How to fix my promise return here for this function?如何在此处修复我的承诺返回此功能?
【发布时间】:2016-01-04 22:17:34
【问题描述】:

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

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

// 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);
}

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

下面是我的 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);
        }
    }
}

【问题讨论】:

  • 你错过了完全的承诺!
  • 在您的 getTagQuotes 函数中,您没有返回任何承诺。因此,当您检查它时未定义。最好阅读一些关于“promises”的文档,例如MDN Promise page
  • @jamiec Promises 告诉函数等待返回某些内容,然后继续沿着链继续,还是继续正确?
  • 不,一点也不。不涉及等待。 Promise 提供了一种方法来提供回调,该回调应在异步操作完成时执行。

标签: javascript angularjs promise angularjs-service


【解决方案1】:

您的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
    (...)
});

【讨论】:

  • .promise 是一个属性而不是一个函数 - 应该没有括号
  • 我在var promise = getTagQuotes(tags) 线上收到了TypeError: Cannot read property 'then' of undefined。稍后将发布一个要点
  • 啊!我忘了回return GetTweetVolFactory.returnTweetVol
  • 您无法退货。如果这样做,for 循环将毫无价值,并且您将始终返回第一个调用。
  • @FernandoPinheiro 谢谢!是的,我刚刚发现了这个问题......试图弄清楚如何在使用 for 循环时返回承诺。我找到了promise.all,但它没有按预期工作,很快就会发布一个新问题。
【解决方案2】:

这个函数没有返回语句。

function getTagQuotes(tags)

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 2011-03-06
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2016-10-05
    相关资源
    最近更新 更多