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,相同的结果->
[]