【问题标题】:Angular Promise, why am I getting 'then' of undefined in this instance?Angular Promise,为什么在这种情况下我会得到未定义的“那么”?
【发布时间】:2016-01-18 02:49:43
【问题描述】:

我的 chartDirective 中有一个函数,它调用服务中的函数以获取数据,格式化该数据,然后从我的 chartDirective 调用另一个函数:

function chartTicker(ticker, disabled) {
    disabled = disabled || false;
    var defer = $q.defer();

    // Clear out previous chart:
    d3.selectAll("svg > *").remove();
    document.getElementById('chart').innerHTML = "";
    chart     = {},
    chartData = [];

    // Get and format data for chart:
    document.getElementById('chart').innerHTML = "<svg></svg>";
    var timeInHours = TimeSpanFactory.getTimeHours();

    var promise = FormatChartDataFactory.getData(ticker, timeInHours).then(function() {
        defer.resolve();
        return defer.promise;
    });
}

但是,我在以下行收到以下错误:

var promise = FormatChartDataFactory.getData(ticker, timeInHours).then(function() {

这是我的FormatChartDataFactory.getData 函数:

function getData(ticker, limit) {
    var defer = $q.defer();
    chartObj.chartData = [{}];
    var limit_range = '';

    if (limit > 0) {
        limit_range = '?limit=' + limit;
    }

    getTickerPrice(ticker, limit_range).then(function() {
        defer.resolve();
        return defer.promise;
    });

    // GET Ticker data and return chartObj into drawChart:
    ////////////////////////////////////////////////////////////////////
    function getTickerPrice(ticker, limit_range) {
        return ApiFactory.getTickerQuotes(ticker.ticker, limit_range)
            .success(function(data, status, headers, config) {
                if (data.status === 'Success') {
                // ....

这里是link to my full FormatChartDataFactory gist file

【问题讨论】:

    标签: javascript angularjs asynchronous promise angular-promise


    【解决方案1】:

    Promise 应该直接从代码返回,而不应该从它的.then 回调返回。简而言之,您没有从函数返回 promise,您正在那里寻找 .then 方法,这会导致错误。

    代码

    //1st place
    var promise = FormatChartDataFactory.getData(ticker, timeInHours).then(function() {
        defer.resolve();
    });
    return defer.promise;
    
    //2nd place
    getTickerPrice(ticker, limit_range).then(function() {
        defer.resolve();
    });
    return defer.promise;
    

    【讨论】:

    • 哈哈,就是这样!这是历史上最快的答案:)
    • @LeonGaban 很高兴帮助你..谢谢:)
    猜你喜欢
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多