0

Durandal/Breeze/Knockoutでアプリを開発しています。

私の JavaScript では、2 つの非同期操作を次々に実行したいと考えています。

  • 1 つ目は、transportId がパラメーターによって渡され、カテゴリが「グローバル」であるすべての「アラーム」を収集することです。

  • 2 つ目は、上記で収集したこれらのエンティティをすべて削除することです

これが私がこれまでに行ったことです:

var checkAlarmsOnTransport = function (id) {

    var alarms = ko.observableArray();
    getAlarms(alarms, id, 'Global')
        .then(deleteAlarms(alarms));
};

var getAlarms = function (alarmsObservable, transportId, category, forceRemote) {
    // Input: transportId
    // Input: category
    // Input: forceRemote: boolean to force the fetch from server
    // Output: alarmsObservable: an observable filled with all the alarms

    if (forceRemote)
        queryCacheAlarms = {};

    var p1 = new Predicate('transportId', '==', transportId);
    var p2 = new Predicate('category', '==', category);
    var query = entityQuery.from('Alarms')
                           .orderBy('id')
                           .where(p1.and(p2));

    var isInCache = (queryCacheAlarms === true);

    if (isInCache && !forceRemote) {
        query = query.using(breeze.FetchStrategy.FromLocalCache);
    } else {
        queryCacheAlarms = true;
        query = query.using(breeze.FetchStrategy.FromServer);
    }

    //old return manager.executeQuery(query)
    //old    .then(querySucceeded)
    //old    .fail(queryFailed);

    var p = manager.executeQuery(query);
    p.then(querySucceeded);
    p.fail(queryFailed);
    return p;

    function querySucceeded(data) {
        console.log("the get return:" + data.results.length); // <---------- added
        alarmsObservable(data.results);
    }
};

var deleteAlarms = function (alarmsObservable) {
    // Input: alarmsObservable: an observable filled with a list of alarms to delete
    // Output: none
    console.log("deleted:" + alarmsObservable().length); // <------------- added
    for (var i = alarmsObservable().length - 1; i >= 0 ; i--) {
        alarmsObservable()[i].entityAspect.setDeleted();
    };
};

これら 2 つの機能を独立してテストすることに成功しました。非同期で使用したいのですが、うまくいきません。

何か案が?

私を正しい方向に向けてくれた人に感謝します。


アップデート

CodeThugが提案したようにコードを更新console.logし、2つの関数に2行を追加して、何が行われたかを追跡しました。上記を参照。

コンソールには次のように表示されます。

  • 削除:0

  • 取得リターン:6

そのため、deleteAlarms関数は の前に呼び出され、0 要素の入力を受け取ったgetAlarmsようです。deleteAlarms

呼び出しが逆になる理由は何ですか?

4

2 に答える 2

0

問題はこのセクションにあると思います:

var alarms = ko.observableArray();
getAlarms(alarms, id, 'Global')
  .then(deleteAlarms(alarms));

あなたはそれをしなければなりません:

var alarms = ko.observableArray();
getAlarms(alarms, id, 'Global')
  .then(function(){deleteAlarms(alarms);});

then に関数を渡す必要があるためです。

これがお役に立てば幸いです。

于 2013-05-03T14:55:17.500 に答える