2

我有一个 Ember 应用程序,它通常会向服务器发出 ajax 请求以获取其数据。我面临的问题是每个请求都需要在 URL 上附加一个签名。此签名需要经常计算,因为它可能仅在 10 秒内有效。系统要求我从服务器请求此签名,可能使用 ajax 请求。所以,我的问题是 Ember 永远不能使用从 ajax 请求返回的签名,因为它不是按预期设计的那样等待。

有问题的代码在这里:http: //jsfiddle.net/veDjq/

在该代码中,signature尽管我可以看到签名请求返回正确的值,但inApp.Post始终是in 。undefinedconsole.logresponseApp.Signature

我是 Ember 的新手,所以我很可能会以这种错误的方式行事。最后,每次 Ember 对象必须从服务器请求数据时,我都需要能够请求新签名。我尝试使用 jQuery$.ajaxSend来更改 URL,但它不适用于 GET 请求。

4

2 回答 2

2

在你的success处理程序内部,this不是你想象的那样。看起来你打算this成为App.Signature班级。为了做到这一点,您可以将context签名 ajax 调用的选项设置为this.

我还建议研究承诺。他们将帮助您清理此代码。例如(未经测试):

App.Signature.reopenClass({
    retrieveSignature: function(){
        return $.ajax({
            url: '/auth/',
        });
    }
});

App.Post.reopenClass({
    postedPosts: [],
    find: function(){
        var postClass = this;
        var signaturePromise = App.Signature.retrieveSignature();
        signaturePromise.done(function(signature){
            var postsRetrieval = $.ajax({
                url: 'http://someserver.com/1/posts/list.json?' + signature,
                dataType: 'json'
            });
            postsRetrieval.done(function(response){
                response.data.forEach(function(post){
                    postClass.postedPosts.addObject(App.Post.create(post))
                });
            });
        });
        return this.postedPosts;
    }
});
于 2012-10-05T04:26:39.017 回答
1

您正在返回this.signature,而$.ajax请求仍在运行。您可能希望将包含主 ajax 调用的回调函数传递给App.Signature.getSignature,并从成功或完成回调中运行该回调。

编辑:等一下。我刚刚意识到您将 async 设置为 false,所以我最初的评论是不正确的。

于 2012-10-04T18:49:36.607 回答