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

标签 javascript angularjs promise angular-promise

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

我不确定如何使用 Promise 或其他方法在填充变量之前正确等待数据(除了使用可怕的 $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});
}

我应该如何在这里使用 promise ?我唯一能想到的另一件事是使用 $scope.watch 函数等待 ticker_chart 的值在尝试渲染某些内容之前进行更改。

最佳答案

您正在 returnTickerChartData 中创建一个 promise ,但我没有看到您返回它。您需要将其更改为

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

    return q.promise;
}

getTickerQuotes.success 中,您只需要用数据解析 promise 。您不需要 returnticker_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,您应该返回该 Promise,而不是使用 deferred 创建一个新的 Promise。同时更改为使用 ApiFactory.getTickerQuotes.then() 而不是 .success()

关于javascript - 如何使用 Promise 使函数在用返回的数据填充变量之前等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32826304/

相关文章:

javascript - ng-model 显示重复值

javascript - 使用 ng-repeat 增加赞成票

angularjs - 使用 Angularjs 后,Adsense 停止显示广告

javascript - button.addEventListener 在嵌套 for 循环中不起作用

javascript - Owl Carousel 不会自动播放

javascript - 如何知道事件发生时触发了什么函数(或代码片段)?

javascript - 弹出窗口触发操作后 View 不刷新

javascript - 使用 async/await Promise 在 "parallel"中运行 for 循环

javascript - 应用程序重新加载时的 Angular 解析

Angular 结合 2 个 promise 到 1 个 promise