【发布时间】:2016-01-04 22:17:34
【问题描述】:
我有一个 tags 数组,其中最多可包含 3 个项目。
接下来我将tags 传递给我的getTagQuotes 函数,并尝试为其设置一个promise 变量。 现在我得到的承诺是未定义的。
// If there are tags, the wait for promise here:
if (tags.length > 0) {
var promise = getTagQuotes(tags).then(function() {
console.log('promise =',promise);
for (var i=0; i<tweetArrayObjsContainer.length; i++) {
chartObj.chartData.push(tweetArrayObjsContainer[i]);
}
chartDirective = ScopeFactory.getScope('chart');
chartDirective.nvd3.drawChart(chartObj.chartData);
});
}
else {
chartDirective = ScopeFactory.getScope('chart');
chartDirective.nvd3.drawChart(chartObj.chartData);
}
^ 上面的目标是在我绘制nvd3 图表之前确保tweetArrayObjsContainer 中的数组已被填充并推入chartObj.chartData。
下面是我的 getTagQuotes 函数,它通过标签(最多 3 个)执行另一个循环,并调用另一个服务 GetTweetVolFactory.returnTweetVol,这使得实际的 API 调用来检索数据。
我有代码检查我们是否在最后一个循环步骤,然后调用formatTagData 函数。
在formatTagData 内部是我填写tweetArrayObjsContainer 的地方。
// Check for and GET tag data:
////////////////////////////////////////////////////////////////////
function getTagQuotes(tags) {
console.log('getTagQuotes called with',tags);
var deferred = $q.defer(); // <- setting $q.defer here
var url = 'app/api/social/twitter/volume/';
for (var i=0; i<tags.length; i++) {
var loopStep = i;
rawTagData = [];
GetTweetVolFactory.returnTweetVol(url+tags[i].term_id)
.success(function(data, status, headers, config) {
rawTagData.push(data);
if (loopStep === (rawTagData.length - 1)) {
// formatTagData fills the tweetArrayObjsContainer with data:
formatTagData(rawTagData);
deferred.resolve(); // <-- last step, so resolve
return deferred.promise;
}
})
.error(function(data, status) {
return 'error in returning tweet data';
});
}
function formatTagData(rawData) {
tweetArrayObjsContainer = [];
for (var i=0; i<rawData.length; i++) {
var data_array = [];
var loopNum = i;
_(rawData[i].frequency_counts).reverse().value();
for (var j=0; j<rawData[loopNum].frequency_counts.length; j++) {
var data_obj = {};
rawData[loopNum].frequency_counts[j].start_epoch = addZeroes(rawData[loopNum].frequency_counts[j].start_epoch);
data_obj.x = rawData[loopNum].frequency_counts[j].start_epoch;
data_obj.y = rawData[loopNum].frequency_counts[j].tweets;
data_array.push(data_obj);
}
var tweetArrayObj = {
"key" : "Quantity"+(i+1),
"type" : "area",
"yAxis" : 1,
"color" : tagColorArray[i],
"values" : data_array
};
tweetArrayObjsContainer.push(tweetArrayObj);
}
}
}
【问题讨论】:
-
你错过了完全的承诺!
-
在您的
getTagQuotes函数中,您没有返回任何承诺。因此,当您检查它时未定义。最好阅读一些关于“promises”的文档,例如MDN Promise page。 -
@jamiec Promises 告诉函数等待返回某些内容,然后继续沿着链继续,还是继续正确?
-
不,一点也不。不涉及等待。 Promise 提供了一种方法来提供回调,该回调应在异步操作完成时执行。
标签: javascript angularjs promise angularjs-service