2016-08-19 11 views
1

Emberの約束事にいくつか問題があります。私が書いた hereからルーキーミス#1以下の:私は理解したようfindRecordが解決され、それが検索したレコードを表示する必要があります場合にのみ、Emberでの約束の作成

return $.getJSON('config.json', (data) => { 
    //some code here... 
    return data; 
}).then(() => { 
    return this.get('store').findRecord('staffMember', 13); 
}).then(record => { 
    console.log(record); 
}); 

を二thenを呼び出す必要があります。代わりにコンソールに約束が表示されます。 なぜですか?

+0

まず最初に、矢印機能で 'this'を使うときは注意が必要です。最初の 'then'ステージの関数はsycnhronousですか?それともそれらは非同期であり、約束オブジェクトを返しますか? – Redu

+0

最初からより多くのコードを追加しました。別の約束を返す 'getJson'関数を使用します。 – Luisetelo

+1

はい、' $ .getJSON'の戻り値は使用しません。それに加えて、 'this.get( 'store')。findRecord( 'staffMember'、13);'時間内に解決される約束を返します。私は非常に 'this.get'を' 'undefined ''と疑っています – Redu

答えて

3

あなたは、jQueryとEmberの(RSVP)約束の間に(ある程度の)非互換性の犠牲者です。 jQueryの約束別のjQueryの約束を吸収します

  • :ここ

    が制約されています。

  • Ember.RSVP約束別のEmber.RSVP約束を同化する。
  • Ember.RSVP約束は約束/ A +互換であり、と同義です。
  • jQuery約束はありません同化Ember.RSVP約束。 jQueryの約束は返されたA + promiseをデータとして見ます。

はここにいくつかの注釈で、質問からのコードです:

return $.getJSON('config.json', (data) => { 
    //some code here... 
    return data; // a return from a direct callback is meaningless (though it doesn't matter here as `data` is not used later downstream). 
}) // at this point, you have a jQuery promise. 
.then(() => { // this is the jQuery promise's .then(). 
    return this.get('store').findRecord('staffMember', 13); // this is an Ember.RSVP promise, which will be seen by the jQuery chain as data, not assimilated. 
}) 
.then(record => { 
    console.log(record); // oh dear, `record` is actually a jQuery promise. 
}); 

はそのために質問されている症状が - 約束がコンソールに記録されます。

修正点は、jQueryの約束がEmber.RSVPチェーンに確実に返されるようにすることです。

はここで主に構文が異なり、それをコーディングする方法のカップルです - の両方が動作するはずです:少しecomomically、

return Ember.RSVP.Promise.resolve() // start the chain with a resolved Ember.RSVP promise. 
.then(function() { 
    return $.getJSON('config.json'); // returned jQuery promise will be recognised as such and assimilated by the Ember.RSVP chain 
}) 
.then(data => { 
    //some code here ... 
    return this.get('store').findRecord('staffMember', 13); // as expected, the returned RSVP promise will also be assimilated. 
}) 
.then(record => { 
    console.log(record); 
}); 

または:

return Ember.RSVP.Promise.resolve($.getJSON('config.json')) // assimilate jQuery promise into Ember.RSVP 
.then(data => { 
    //some code here ... 
    return this.get('store').findRecord('staffMember', 13); // returned RSVP promise will also be assimilated 
}) 
.then(record => { 
    console.log(record); 
}); 

注:jQueryの3.0から、 jQueryはPromises/A +に準拠した約束を遂行しています。