2016-05-20 7 views
0

私は、1つの投稿と1つの投稿の2つの機能を持つモデルを持っています。バックボーン+プロミス - ポスト後にフェッチする方法

フェッチ:

fetch: function (options) { 
    var self = this; 

    return P1Comm.get({ 
    'dataType': 'json', 
    'processAjaxResponse': self.processAjaxResponse, 
    'onStatusInvalid': function (e) { 
     P1.log(e, 'status'); 
    }, 
    'onSuccess': options.success, 
    'onError': function (e) { 
     P1.log(e); 
    }, 
    'sourceURL': P1.API_APPS_ROOT + 'v1.0/accepted-terms' 
    }); 
}, 

をポスト:

acceptTerms: function (appId) { 
    var self = this; 

    self.set({ 
    'app_id': parseInt(appId,10) 
    }); 
    self.createEdit(self.toJSON(), { 
    }).pipe(function() { 
    var def = $.Deferred(); 
    var saveOpts = { 
     dataType: 'json', 
     stringify: true, 
     contentType: 'application/json', 
     processData: false, 
     processAjaxResponse: self.processAjaxResponse 
     }; 
    self.save(self.toJSON(), saveOpts); 
    return def.promise(); 
    }); 
}, 

をビューからのポストを呼び出す:acceptAppTerms.acceptTerms(1);

、それ自体でこれらの作業の両方が、私はそう、これを変更したいですそれ: - POSTを行うacceptTerms() - 次にGETをfetch() - そして、私はそれが(少なくとも最初の2点のために)このようなものになるだろうと思います

別の関数を呼び出す:

acceptAppTerms.acceptTerms(id).then(function() { 
    this.launchApp(event, id); 
}); 

しかし、私はそれがないですUncaught TypeError: Cannot read property 'then' of undefined

のエラーが出ますフロントエンドで良い - 誰かが私を正しい方向に向けることができますか?

おかげ

UPDATE:作品以下

fetchAcceptedTerms: function() { 
    var self = this; 
    this.appAcceptedTerms = new T1AppAcceptedTerms(); 
    this.acceptedTerms = new AppAcceptedTerms(); 

    this.acceptedTerms.fetch({ 
    success: function (data) { 
     if (data.meta.status === 'success') { 
     self.appAcceptedTerms.set(data.data); 
     } 
    } 
    }); 
}, 

例が、それはモデルへのデータの設定を破ります。

+0

質問と回答の回答から、これはバックボーンQ&AではなくjQuery Q&Aに似ています。 .save()メソッドを除いて、他のすべてはjQueryを使用しています。おそらく、タイトルは "jQuery + Promises - 投稿後に取得する方法"で、タグはbackbone.jsからjQueryに切り替える必要がありますか?とにかく、Backbone .fetch()呼び出しを約束して動作させる方法と、まだ動作中のコードが見つからないという良い例を探しながら、これを見つけました。 – Clomp

答えて

1

acceptTermsが何も返さないか、言い換えればにthen()メソッドが含まれていないためにエラーが発生したためです。

あなたのコードのようなものでなければなりません:このコードはP1Comm.getself.createEditself.saveが約束オブジェクトを返すことasummes

fetch: function(options) { 
    var self = this; 
    return P1Comm.get({ 
     dataType: 'json', 
     processAjaxResponse: self.processAjaxResponse, 
     onStatusInvalid: function(e) { 
     P1.log(e, 'status'); 
     }, 
     onSuccess: options.success, 
     onError: function(e) { 
     P1.log(e); 
     }, 
     sourceURL: P1.API_APPS_ROOT + 'v1.0/accepted-terms' 
    }); 
}, 

acceptTerms: function(appId) { 
    var self = this; 
    self.set({ 
     'app_id': parseInt(appId, 10) 
    }); 

    return self.createEdit(self.toJSON(), {}).pipe(function() { 
    //---------------------------------------^ better use .then() 
     var saveOpts = { 
     dataType: 'json', 
     stringify: true, 
     contentType: 'application/json', 
     processData: false, 
     processAjaxResponse: self.processAjaxResponse 
     }; 
     return self.save(self.toJSON(), saveOpts); 
    }); 
}, 

。そうでない場合はDeferredオブジェクトを作成し、これらの関数から約束を返す必要があります。そして、それらの非同期アクションの成功/エラーコールバック内では、それに応じて約束をresolve/rejectにする必要があります。

また、.pipe()は旧式のjQueryを使用していない限り、then()を使用する必要があります。

関連する問題