2

私は通常、データを取得するためにサーバーにajaxリクエストを送信するEmberアプリケーションを持っています。私が直面している問題は、各リクエストにURLに署名を追加する必要があるということです。この署名は、おそらく10秒間しか有効ではないため、頻繁に計算する必要があります。システムでは、おそらくajaxリクエストを使用して、サーバーからこの署名をリクエストする必要があります。したがって、私の問題は、Emberがajaxリクエストから返された署名を使用できないことです。これは、期待どおりに待機するように設計されていないためです。

問題のコードはここにあります:http://jsfiddle.net/veDjq/

そのコードでは、signatureinsideApp.Postは常にundefinedですが、私console.logresponseinの場合、署名の要求が正しい値を返すことがわかりますApp.Signature

私はEmberを初めて使用するので、この間違った方法で作業する可能性が高くなります。最終的に、Emberオブジェクトがサーバーにデータを要求するたびに、新しい署名を要求できるようにする必要があります。jQueryを使用してURLを変更しようとしました$.ajaxSendが、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 に答える