链接后续承诺并等待所有人解决

时间:2014-10-14 13:39:01

标签: javascript angularjs angular-promise

我已经阅读了一些关于承诺的文章和问题,但我仍然有问题要解决它们。这就是我想要做的事情:

我的应用程序应该从设备请求属性。属性可以表示为单个值或Array。每个属性都有属性,它为我提供有关它的信息(就像它是一个数组,它是可写的等等。)

所以我的第一次尝试是首先阅读属性的属性。所以我可以看看我是否需要读取单个值或数组(例如)。

一切都在使用websockets,所以我没有使用angulars $ http服务。

var valueRequests = [];

angular.forEach(properties, function (property, key) {

    requestPropertyAttributes(property).then(function (result) {

        if (result.isList) {

            valueRequests.push(requestPropertyList(property));
        }
        else {

            valueRequests.push(requestPropertyValue(property));
        }
    });
});

$q.all(valueRequests).then(function () {

    //do sth. after all data was read
});

好吧,我得到的只是一些错误(它读取列表的值和/或反之亦然)和$ q.all()不会触发。

我的要求函数正在返回承诺。

这是正确的尝试还是我在某处失败了?如上所述我对承诺并不十分肯定,所以我可能在这里理解机制存在问题。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:4)

您需要在第一个then内返回内部承诺,然后将该承诺添加到列表中。

var valueRequests = [];

angular.forEach(properties, function (property, key) {

    valueRequests.push(requestPropertyAttributes(property).then(function (result) {

        if (result.isList) {

            return requestPropertyList(property);
        }
        else {

            return requestPropertyValue(property);
        }
    }));
});

$q.all(valueRequests).then(function () {

    //do sth. after all data was read
});

答案 1 :(得分:1)

有点不清楚你究竟在尝试什么。但是,我认为您需要更改代码,如下所示:

var valueRequests = [];

angular.forEach(properties, function (property, key) {

    valueRequests.push(requestPropertyAttributes(property).then(function (result) {

        if (result.isList) {

            return requestPropertyList(property);
        }
        else {

            return requestPropertyValue(property);
        }
    }));
});

$q.all(valueRequests).then(function () {

    //do sth. after all data was read
});

这应该确保在解决所有其他promise之前,附加到$ q.all的然后才会触发。如果从then(...)函数返回promise,则(...)返回该promise。否则,它会创建一个承诺并返回,而这与您的Web请求无关。