Javascript 如何使用promise使函数在用返回的数据填充变量之前等待?
我有一个返回股票报价数据的API,我的问题是在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) {
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
只能在我