这是我的JS:
self.obj = {}
self.obj.accessErrors = function(data) {
var cerrorMessages = [];
for (prop in data) {
if (data.hasOwnProperty(prop)){
if (data[prop] != null && data[prop].constructor == Object) {
self.obj.fetch[accessErrors](data[prop]);
}
else {
cerrorMessages.push(data[prop]);
}
}
}
return cerrorMessages;
};
self.obj.fetch = {
X: function() {
// do stuff.
},
Y: function(callback) {
$http.get('/yposts/').then(
function(response) {
self.posts = response.data;
callback(self.posts);
},
function(response) {
self.posts = {};
self.obj.accessErrors(response.data).then(function(cerrrorMessages) {
callback(posts, cerrorMessages);
});
}
);
}
};
我收到指向此行的错误:
self.obj.accessErrors(response.data).then(function(cerrrorMessages) {
错误说:
TypeError: self.obj.accessErrors(...).then is not a function
知道如何解决这个问题吗?
答案 0 :(得分:6)
self.obj.accessErrors(response.data)
不会返回承诺,因此,您不能在其上使用promise方法。
如果您希望它返回一个承诺,并且您希望该承诺能够反映所有fetch()
操作何时完成并且这些操作实际上是异步的,那么您必须将所有异步代码转换为使用promises和你必须使用Promise.all()
或角度等价物将它们全部组合起来,并使用fetch中的回调转换为仅使用promise。现在,你有一个难以编程的混合。
答案 1 :(得分:6)
仅在使用Promise对象时才需要.then()
构造 - 本质上,该函数返回一个解析的对象,而不是返回一个值。将来(然后传递给您传递给.then()
的函数。
但你是正确的,你需要一个异步模式来正确地执行此操作,因为fetch.Y
是一个异步方法。一件好事就是在accessErrors
函数的开头创建一个promise数组,如下所示:
var fetchPromises = [];
然后将self.obj.fetch[accessErrors](data[prop]);
替换为在该数组上调用push
的内容,以添加fetch
返回给它的承诺。
然后,不是返回accessErrors
,而是返回Promise.all(fetchPromises)
。
这将需要对您的代码进行一些相当重要的修改 - 但是,您需要重写它以便它使用Promise API而不是单独使用此回调(这不应该太难)