我已经阅读了一些关于承诺的文章和问题,但我仍然有问题要解决它们。这就是我想要做的事情:
我的应用程序应该从设备请求属性。属性可以表示为单个值或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()不会触发。
我的要求函数正在返回承诺。
这是正确的尝试还是我在某处失败了?如上所述我对承诺并不十分肯定,所以我可能在这里理解机制存在问题。
感谢您的帮助:)
答案 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请求无关。