如何在使用返回的数据填充变量之前使用promise使函数等待?

时间:2015-09-28 15:09:31

标签: javascript angularjs promise angular-promise

我有一个返回股票报价数据的API,我的问题是在return_array有数据之前,模型变量首先是未定义的。

我不确定在填充变量之前如何使用promises或其他方法正确等待数据(除了使用可怕的$timeout hack)。

我在Chrome检查器中可以看到的问题ticker_chart = undefined):

enter image description here

在获得值之前,我需要等待ticker_chart

调用服务以返回股票报价数据的第一个函数:

function renderChart(ticker, limit) {
    ticker_chart = TickerChartFactory.returnTickerChartData(ticker, limit);
    console.log('ticker_chart = ',ticker_chart);
}

全面服务功能:

function returnTickerChartData(ticker, limit) {

    var q = $q.defer();

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

    ApiFactory.getTickerQuotes(ticker.ticker).success(
        function(data, status, headers, config) {
            if (data.status == 'Success') {
                console.log('REST GET Ticker Chart', 'success');
                var data_array = [];

                for (var i=0; i<data.quotes.length; i++) {
                    data_array.push([data.quotes[i].start_epoch, data.quotes[i].price]);
                }

                var return_array = [{
                    "area": true,
                    "key": "Price",
                    "color": '#BFBFBF',
                    "values": data_array
                }];

                console.log('return_array = ',return_array);
                console.log('q =',q);
                q.resolve(return_array);
                return ticker_chart = return_array;

            } else {
                console.log('failed to REST GET Ticker Chart');
                q.reject('failed to REST GET Ticker Chart');
                return ticker_chart = 'failed to REST GET Ticker Chart';
            }
        }).error(function(data, status) {
            console.log('error in getting REST GET Ticker Chart');
            q.reject('error in getting REST GET Ticker Chart');
            return ticker_chart = 'error in getting REST GET Ticker Chart';
        });
}

getTickerQuotes中的ApiFactory功能:

function getTickerQuotes(ticker) {
    return $http.get('https://www.ourapi.../api/tickers/quotes/'+ticker, {cache: false});
}

我应该如何使用这里的承诺?我能想到的另一件事就是使用$ scope.watch函数等待ticker_chart的值在尝试渲染之前发生变化。

1 个答案:

答案 0 :(得分:3)

你正在returnTickerChartData创建一个承诺,但我没有看到你回复它。您需要将其更改为

function returnTickerChartData(ticker, limit) {
    var q = $q.defer();
    // API call

    return q.promise;
}

getTickerQuotes.success中,您只需要使用数据解决承诺。您不需要第return ticker_chart = return_array;行。 然后,

function renderChart(ticker, limit) {
    TickerChartFactory.returnTickerChartData(ticker, limit)
        .then(function (result) {
            ticker_chart = result;
            console.log('ticker_chart = ', ticker_chart);
        });
}

编辑:@Bergi在评论中提出了一个有效点。如果ApiFactory.getTickerQuotes已经返回了一个promise,那么你应该返回它而不是使用deferred创建一个新的promise。同时更改为使用ApiFactory.getTickerQuotes.then()而不是.success()