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

Javascript 如何使用promise使函数在用返回的数据填充变量之前等待?,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我有一个返回股票报价数据的API,我的问题是在return\u数组有数据之前先返回未定义的模型变量 我不知道如何使用promises或其他方法在填充变量之前正确等待数据(除了使用糟糕的$timeouthack) 你可以在chrome inspector中看到我的问题(ticker\u chart=undefined): 我需要ticker\u chart等待,然后才能获得值 调用服务以返回股票报价数据的第一个函数: function renderChart(ticker, limit) {

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

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


你可以在chrome inspector中看到我的问题(
ticker\u chart=undefined
):

我需要
ticker\u 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';
        });
}

我应该如何使用这里的承诺?我唯一能想到的另一件事是使用$scope.watch函数等待
ticker\u chart
的值发生变化,然后再尝试渲染某些内容。

您正在
returnTickerChartData
中创建承诺,但我看不到您会返回它。你需要把它改成

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

    return q.promise;
}
getTickerQuotes.success
中,您只需要用数据来解析承诺。您不需要行
returnticker\u chart=return\u数组。
然后呢,

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

编辑:@Bergi在注释中提出了一个有效点。如果
ApiFactory.getTickerQuotes
已经返回了一个承诺,那么应该返回该承诺,而不是创建一个带有延迟的新承诺。也可以改为使用
ApiFactory.getTickerQuotes.then()
而不是
.success()
您正在
returnTickerChartData
中创建承诺,但我看不到您会返回它。你需要把它改成

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

    return q.promise;
}
getTickerQuotes.success
中,您只需要用数据来解析承诺。您不需要行
returnticker\u chart=return\u数组。
然后呢,

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

编辑:@Bergi在注释中提出了一个有效点。如果
ApiFactory.getTickerQuotes
已经返回了一个承诺,那么应该返回该承诺,而不是创建一个带有延迟的新承诺。也可以改为使用
ApiFactory.getTickerQuotes.then()
而不是
.success()
您正在
returnTickerChartData
中创建承诺,但我看不到您会返回它。你需要把它改成

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

    return q.promise;
}
getTickerQuotes.success
中,您只需要用数据来解析承诺。您不需要行
returnticker\u chart=return\u数组。
然后呢,

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

编辑:@Bergi在注释中提出了一个有效点。如果
ApiFactory.getTickerQuotes
已经返回了一个承诺,那么应该返回该承诺,而不是创建一个带有延迟的新承诺。也可以改为使用
ApiFactory.getTickerQuotes.then()
而不是
.success()
您正在
returnTickerChartData
中创建承诺,但我看不到您会返回它。你需要把它改成

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

    return q.promise;
}
getTickerQuotes.success
中,您只需要用数据来解析承诺。您不需要行
returnticker\u chart=return\u数组。
然后呢,

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

编辑:@Bergi在注释中提出了一个有效点。如果
ApiFactory.getTickerQuotes
已经返回了一个承诺,那么应该返回该承诺,而不是创建一个带有延迟的新承诺。也可以改为使用
ApiFactory.getTickerQuotes.then()
而不是
.success()

returnTickerChartData
只能在异步时返回承诺。
renderChart
需要预先考虑到这一点,并使用
然后
来代替对
控制台.log的同步调用。没有办法。将回调函数作为第三个参数传递给
returnTickerChartData
函数,并在承诺返回数据时使用数据调用回调。例如,
函数回调(data){ticker\u chart=data;}
成功(回调)
。你能举个例子吗?我刚刚尝试了
TickerChartFactory.returnTickerChartData(ticker,limit)。然后(function(data){
但是得到了
无法读取未定义的属性'then'
哦,等等,我忘记了在我的tickerChartFactory中返回ApiFactory函数调用…正在进行
returnTickerChartData
只能在异步的情况下返回一个承诺。
renderChart
需要预测到这一点,并使用
then
不要同步调用
console.log
。没有办法。将回调函数作为第三个参数传递给
returnTickerChartData
函数,并在承诺返回数据时使用数据调用回调。例如
函数回调(data){ticker\u chart=data;}
成功(回调)
。你能举个例子吗?我刚刚试过
TickerChartFactory.returnTickerChartData(ticker,limit)。然后(function(data){
但是得到了
无法读取未定义的属性'then'
哦,等等,我忘记了在我的tickerChartFactory中返回ApiFactory函数调用…正在进行
returnTickerChartData
只能在异步的情况下返回一个承诺。
renderChart
需要预测到这一点,并使用
then
不要同步调用
console.log
。没有办法。将回调函数作为第三个参数传递给
returnTickerChartData
函数,并在承诺返回数据时使用数据调用回调。例如
函数回调(data){ticker\u chart=data;}
成功(回调)
。你能举个例子吗?我刚刚试过
TickerChartFactory.returnTickerChartData(ticker,limit)。然后(function(data){
但是得到了
无法读取未定义的属性“then”
哦,等等,我忘记在我的tickerChartFactory中返回ApiFactory函数调用…正在进行
returnTickerChartData
只能在我