AngularJS Promise返回空数组

时间:2015-05-25 00:31:49

标签: javascript angularjs

我在工厂里有这个代码:

verse

请注意,.then(res)对象正常返回的一切正常。但是,当我在使用res的控制器中使用它时。 []返回- (float)xPositionFromSliderValue:(UISlider *)aSlider; { float sliderRange = aSlider.frame.size.width - aSlider.currentThumbImage.size.width; float sliderOrigin = aSlider.frame.origin.x + (aSlider.currentThumbImage.size.width / 2.0); float sliderValueToPixels = (((aSlider.value-aSlider.minimumValue)/(aSlider.maximumValue-aSlider.minimumValu‌​e)) * sliderRange) + sliderOrigin); return sliderValueToPixels; } ,而不是填充诗句对象的数组。

有谁可以指出为什么?谢谢!

1 个答案:

答案 0 :(得分:3)

简短回答是因为$q.all$timeout之前运行。嵌入$http的{​​{1}}之前。让我们将原始代码简化为相关组件:

$timeout

看到问题?如果由于一些奇怪的原因你需要保留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 } ,这里的修复具有实质性的承诺重构&删除awful jquery-inspired non-promisy success syntax):

$timeout

然而,这里仍然存在一个巨大的问题...为什么你不在任何地方使用getAyahsByJuz: function (juzIndex) { var self = this; // $timeout itself returns a promise which we can post-process using its callback return value return $timeout(function () { // returning the $http promise modifies the $timeout promise return $http.get('data/quran.json').then(function (response) { // you never used this response! var versePromises = []; var ayahs = Quran.ayah.listFromJuz(juzIndex); angular.forEach(ayahs, function (value, key) { // we'll push all versePromises into an array… var versePromise = self.getVerse(value.surah, value.ayah).then(function (res) { // the return value of this `then` modifies `versePromise` return { surah: value.surah, ayah: value.ayah, text: res }; }); versePromises.push(versePromise); }); return $q.all(versePromises); // modifies $http promise — this is our ultimate promised value // if a versePromise fails, $q.all will fail; add a `catch` when using getAyahsByJuz! }); }, 30); } 电话的服务器响应?第一次电话有什么意义?

此外,我发现$http非常可疑。如果你需要它,那么代码中的其他地方可能会发生一些不好的事情。