使用AngularJS时,“.then()不是函数”错误

时间:2015-11-21 00:57:22

标签: javascript angularjs

这是我的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

知道如何解决这个问题吗?

2 个答案:

答案 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而不是单独使用此回调(这不应该太难)