Javascript AngularJS Promise返回空数组
我在一家工厂有此代码:Javascript AngularJS Promise返回空数组,javascript,angularjs,Javascript,Angularjs,我在一家工厂有此代码: getAyahsByJuz: function (juzIndex) { var response = []; var promises = []; var self = this; var deferred = $q.defer(); $timeout(function () { $http.get('data/quran.json').success(func
getAyahsByJuz: function (juzIndex) {
var response = [];
var promises = [];
var self = this;
var deferred = $q.defer();
$timeout(function () {
$http.get('data/quran.json').success(function (data) {
var ayahs = Quran.ayah.listFromJuz(juzIndex);
angular.forEach(ayahs, function (value, key) {
var promise = self.getVerse(value.surah, value.ayah).then(function (res) {
var verse = {
surah: value.surah,
ayah: value.ayah,
text: res
};
response.push(verse);
}, function (err) {
console.log(err);
});
promises.push(promise);
});
});
}, 30);
$q.all(promises).then(function() {
deferred.resolve(response);
});
return deferred.promise;
},
请注意,一切正常,verse
对象正在正确返回。但是,当我在控制器中使用时,则(res)
res
返回[]
,而不是充满verse对象的数组
有人能指出原因吗?谢谢 简短的回答是因为
$q.all
在$timeout
中嵌入的$http
之前运行。让我们将原始代码归结为相关组件:
getAyahsByJuz: function (juzIndex) {
var response = [];
var promises = [];
var deferred = $q.defer();
// ...irrelevant stuff that will happen after a $timeout
// this happens IMMEDIATELY (before $timeout):
$q.all(promises).then(function() { // wait for empty promise array
deferred.resolve(response); // resolve with empty response array
}); // side note: this is a broken chain! deferred.promise can't reject
return deferred.promise; // send promise for empty array
}
看到问题了吗?如果出于某种奇怪的原因,您需要保留该$timeout
,下面是一个修复方法,其中包含大量承诺重构和删除:
然而,这里仍然存在一个巨大的问题……为什么不在任何地方使用$http
调用的服务器响应?第一次打电话有什么意义
我还发现,
$timeout
非常可疑。如果您需要它,那么代码中的其他地方可能有不好的地方。简单的回答是因为您的$q.all
在$timeout
中嵌入的$http
之前运行。让我们将原始代码归结为相关组件:
getAyahsByJuz: function (juzIndex) {
var response = [];
var promises = [];
var deferred = $q.defer();
// ...irrelevant stuff that will happen after a $timeout
// this happens IMMEDIATELY (before $timeout):
$q.all(promises).then(function() { // wait for empty promise array
deferred.resolve(response); // resolve with empty response array
}); // side note: this is a broken chain! deferred.promise can't reject
return deferred.promise; // send promise for empty array
}
看到问题了吗?如果出于某种奇怪的原因,您需要保留该$timeout
,下面是一个修复方法,其中包含大量承诺重构和删除:
然而,这里仍然存在一个巨大的问题……为什么不在任何地方使用$http
调用的服务器响应?第一次打电话有什么意义
我还发现,
$timeout
非常可疑。如果您需要它,那么代码中的其他地方可能有不好的地方。简单的回答是因为您的$q.all
在$timeout
中嵌入的$http
之前运行。让我们将原始代码归结为相关组件:
getAyahsByJuz: function (juzIndex) {
var response = [];
var promises = [];
var deferred = $q.defer();
// ...irrelevant stuff that will happen after a $timeout
// this happens IMMEDIATELY (before $timeout):
$q.all(promises).then(function() { // wait for empty promise array
deferred.resolve(response); // resolve with empty response array
}); // side note: this is a broken chain! deferred.promise can't reject
return deferred.promise; // send promise for empty array
}
看到问题了吗?如果出于某种奇怪的原因,您需要保留该$timeout
,下面是一个修复方法,其中包含大量承诺重构和删除:
然而,这里仍然存在一个巨大的问题……为什么不在任何地方使用$http
调用的服务器响应?第一次打电话有什么意义
我还发现,
$timeout
非常可疑。如果您需要它,那么代码中的其他地方可能有不好的地方。简单的回答是因为您的$q.all
在$timeout
中嵌入的$http
之前运行。让我们将原始代码归结为相关组件:
getAyahsByJuz: function (juzIndex) {
var response = [];
var promises = [];
var deferred = $q.defer();
// ...irrelevant stuff that will happen after a $timeout
// this happens IMMEDIATELY (before $timeout):
$q.all(promises).then(function() { // wait for empty promise array
deferred.resolve(response); // resolve with empty response array
}); // side note: this is a broken chain! deferred.promise can't reject
return deferred.promise; // send promise for empty array
}
看到问题了吗?如果出于某种奇怪的原因,您需要保留该$timeout
,下面是一个修复方法,其中包含大量承诺重构和删除:
然而,这里仍然存在一个巨大的问题……为什么不在任何地方使用$http
调用的服务器响应?第一次打电话有什么意义
我还发现,
$timeout
非常可疑。如果您需要它,那么代码中的其他地方可能有不好的地方。您是否尝试将$q.all(承诺)
放入$timeout
函数中?@cespon-yup,相同的结果->[]
您是否尝试将$q.all(承诺)
放入$timeout
函数中?@cespon-yup,相同的结果->[]
您是否尝试将$q.all(承诺)
放入$timeout
函数中?@cespon-yup,相同的结果->[]
您是否尝试将$q.all(承诺)
放入$timeout
函数中?@cespon-yup,相同的结果->[]