【问题标题】:Need help in resolving nested promises, Promises are not getting resolved需要帮助解决嵌套的承诺,承诺没有得到解决
【发布时间】:2016-09-28 18:52:32
【问题描述】:

我设计了一个服务,它接受一些参数,然后循环输入数组,找出哪个项目是空的,然后将它们添加到数组中,然后在 $q.all 解决之后它应该给我空项目的数组.

输入是项目数组

function getElements(inputs) {
            var elements= [],
                promise, whenPromise,
                promises = [],
                mainPromise = $q.defer();
            if (inputs.length === 0) {
                mainPromise.resolve(elements);
                return mainPromise.promise;
            }

            angular.forEach(inputs, function (input) {
                promise = getPromises(input);
                whenPromise = $q.resolve(promise).then(function (response) {
                $timeout(function() {
                        if (response.isEmpty) {
                  **//perform action with the response.data;**
                        }
                  });
                }, function () {

                });

                promises.push(whenPromise);
            });


            $q.all(promises).finally(function () {
                 mainPromise.resolve(outdatedEntities);

            });

            return mainPromise.promise;
        }

        function getPromises(input) {
            var deferred = $q.defer();

            someSerivce.getItemDetails(input.Id).then(function (value) {
                if (value === null) {
                    $timeout(function () {
                        deferred.resolve({data: input, isEmpty: true});
                    });

                } else {
                    //have item locally, but need to see if it's current
                    input.isEmpty().then(function (isEmpty) {
                        $timeout(function () {
                            deferred.resolve({data: input, isEmpty: isEmpty});
                        });
                    }, function (error) {
                        deferred.reject(error);
                    });
                }

            });

            return deferred.promise;
        }

现在,问题是 $q.all 永远无法解决。尽管所有的内部承诺都得到了解决。

【问题讨论】:

  • 每个承诺的此代码是否已到达if (response.isEmpty) {
  • 是的,但是在 $timout 包裹之后
  • 在 $timout 包裹之后 - 你是什么意思?
  • $timeout(function () { if (response.isOutDated) { addUniqueEntity(outdatedEntities, response.item); } });
  • 我在您的代码中看不到这一点。更新您的代码。以及为什么你在getPromises 中将所有内容都包裹在超时中,比如$timeout(function () { deferred.resolve({data: input, isEmpty: true}); });

标签: javascript angularjs angular-promise


【解决方案1】:

这应该可行:

function getElements(inputs) {
    var elements = [],
            promise, whenPromise,
            promises = [],
            mainPromise = $q.defer();
    if (inputs.length === 0) {
        mainPromise.resolve(elements);
        return mainPromise.promise;
    }

    angular.forEach(inputs, function (input) {
        promise = getPromises(input);
        whenPromise = promise.then(function (response) {

            if (response.isEmpty) {
                * *//perform action with the response.data;**
            }

        }, function () {

        });

        promises.push(whenPromise);
    });


    return $q.all(promises).finally(function () {
        return outdatedEntities;
    });
}

function getPromises(input) {
    return someSerivce.getItemDetails(input.Id).then(function (value) {
        if (value === null) {
            return {data: input, isEmpty: true};
        } else {
            //have item locally, but need to see if it's current
            return input.isEmpty().then(function (isEmpty) {
                return {data: input, isEmpty: isEmpty};
            }, function (error) {
                return error;
            });
        }
    });
}

【讨论】:

  • 对不起,但我有一个小疑问:return deferred.resolve({data: input, isEmpty: isEmpty}); ?定义这个延迟承诺的地方
  • @Dreamweaver,是的,打错字了,换成return {data: input, isEmpty: isEmpty}
  • 好的 :) .. 我也做了同样的事,但想和你确认一下 .. :)
  • 是的,它成功了,我正在修改为每个 promise 添加 defer 对象
  • @Dreamweaver,好的,那么你可以接受并投票赞成我的回答:)
猜你喜欢
  • 2022-01-16
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 2015-06-24
  • 2019-10-18
相关资源
最近更新 更多