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
呼び出しが逆になる理由は何ですか?