1

Durandal を利用した HotTowel SPA テンプレートを使用しています。私の Durandal ViewModels では、Breeze を使用してデータベースからデータを取得しています。

すべての簡単なクエリを入れる datacontext クラスがあり、クエリはすべて次のようなパターンに従います。

getAthletes: function (queryCompleted) {
            var query = breeze.EntityQuery.from("Athletes");
            return manager
                .executeQuery(query)
                .then(queryCompleted)
                .fail(queryFailed)
        }

ビュー モデルの activate メソッドで非同期呼び出しを行っているため、これらの呼び出しから返される promise を activate メソッドで返す必要があります。

単一のクエリを使用すると、次のようにうまく機能します。

function activate() {
  datacontext.getAthlete(loadAthlete);
}

ただし、2 つのクエリを実行する必要がある場合、問題が発生しますが、これはアプリケーションのリリース バージョンでのみ発生します。私は次の構文でこれをやろうとしました:

function activate() {
  datacontext.getAthlete(loadAthlete).then(datacontext.getOtherData(loadOtherData));
}

これはデバッグ モードでは問題なく動作しますが、サーバーにデプロイしてスクリプトをバンドルすると、あまり明確ではない例外が発生します。

t は関数ではありません

また、以下のように datacontext クラスでそれらをチェーンしようとしましたが、それでも同じエラーが発生します。

getAthleteAndEfforts: function (athleteId, athleteQueryCompleted, effortsQueryCompleted) {
    var athleteQuery = breeze.EntityQuery.from("Athletes").where("id", "==", athleteId);
    var effortsQuery = breeze.EntityQuery.from("BestEfforts").where("athleteId", "==", athleteId);

    return manager.executeQuery(athleteQuery).then(athleteQueryCompleted)
        .then(manager.executeQuery(effortsQuery).then(effortsQueryCompleted))
        .fail(queryFailed);
}

だから私は Q.defer() を適切に使用するのに十分理解していないか、何か他のことが起こっていると仮定しています。

これを達成するための正しい構文は何ですか?

4

2 に答える 2

3

わかりました、これを見つけるために正しい方向に私を向けてくれたRainerAtSpiritに感謝します。John Papa の jumpstarter examples を見たところ、彼はこれを行う datacontext を primeData function の下に持っています

そこで彼が使用した構文を使用して、次のように正しく動作させることができました。

getAthleteAndEfforts: function (athleteId, athleteQueryCompleted, effortsQueryCompleted) {
    return Q.all([
                datacontext.getAthlete(athleteId, athleteQueryCompleted),
                datacontext.getAthleteEfforts(athleteId, effortsQueryCompleted)]);
}

Qのドキュメントで Q.all を見たことがありますが、使い方がわかりませんでしたが、この例は役に立ちました。これをテストしたところ、デバッグ モードとリリース モードの両方で動作します。

于 2013-06-10T19:04:17.877 に答える
0

最初のバージョンが機能している理由はまったくわかりませんが、datacontext が非同期呼び出しを行っているときに約束を返します。

function activate() {
  return datacontext.getAthlete(loadAthlete);
}

また

function activate() {
  return datacontext.getAthlete(loadAthlete).then( return datacontext.getOtherData(loadOtherData));
}

他の例については、@John Papa の jumpstarter を確認してください: https://github.com/johnpapa/PluralsightSpaJumpStartFinal/search?q=activate

于 2013-06-10T18:32:08.160 に答える