我已经阅读了一些关于承诺的文章和问题,但我仍然无法理解它们。这是我想要做的:
我的应用程序应该从设备请求属性。属性可以表示为单个值,也可以表示为数组。每个属性都有属性,这些属性给我提供有关它的信息(比如它是一个数组吗,它是可写的吗,等等)。
所以我的第一个尝试是先读取属性的属性。因此,我可以查看是否需要读取单个值或数组(例如)。
一切都与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
});
好吧,我得到的只是一些错误(它显示list where are value和/或反之亦然),并且$q.all()不会触发。
我的请求函数返回承诺。
这是正确的尝试,还是我在某处失败了?正如我所说的,我对promises不是很确定,所以我在理解这里的机制时可能会有问题。
感谢您的帮助:)
发布于 2014-10-14 21:55:45
您需要在第一个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
});
发布于 2014-10-14 21:56:56
现在还不太清楚你到底在尝试什么。但是,我认为您需要更改代码,如下所示:
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
});
这应该确保在解决所有其他承诺之前,不会触发附加到$q.all的。如果您从then(...)返回一个承诺函数,然后(...)返回那个承诺。否则,它会创建一个promise并返回该promise,而该promise与您的web请求无关。
https://stackoverflow.com/questions/26362295
复制相似问题