我在工厂里有这个代码:
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.minimumValue)) * sliderRange) + sliderOrigin);
return sliderValueToPixels;
}
,而不是填充诗句对象的数组。
有谁可以指出为什么?谢谢!
答案 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
非常可疑。如果你需要它,那么代码中的其他地方可能会发生一些不好的事情。