Breeze.js を使用してデータのチャンクを返す小さなクエリ セットをループして実行する関数があります。コードのすべてのセクションが機能しますが、1 行 (クエリの結果を配列に追加しようとする場所) を除きます。私はあらゆる種類のことを試しましたが、なぜそれが機能しないのか理解できないようです.
function doStuff(sourceArray, outputObservable, errorObservable) {
var arr = [];
_.each(sourceArray, function (sourceItem) {
return breeze.EntityQuery
.from("SomeTable")
.using(manager).execute()
.then(getSucceeded)
.fail(getFailed);
function getSucceeded(data) {
_.each(data.results, function (item) {
console.log(item); //This works
arr.push(item); //This doesn't work
});
}
function getFailed(error) {
errorObservable("Error retrieving data: " + error.message);
}
});
outputObservable(arr);
}
これにより、各クエリのすべての結果がコンソールに出力されますが、結果は配列に出力されません。ただし、2 行目を次のように変更するとvar arr = [ 1, 2, 3, 4, 5 ];
、それらの値が outputObservable に反映されます。
編集:完全な解決策は以下のとおりです。
function doStuff(sourceArray, outputObservable, errorObservable) {
var promises = [];
var arr = [];
//Create an array of promises
_.forEach(sourceArray, function (item) {
promises.push(getDataFromServer(item.val1, item.val2));
});
//Wait for all promises to resolve, then set output
Q.all(promises).then(function () {
outputObservable(arr);
});
function getDataFromServer(filter1, filter2) {
var p1 = breeze.Predicate.create("field1", "==", filter1);
var p2 = breeze.Predicate.create("field2", "==", filter2);
return breeze.EntityQuery
.from("SomeTable")
.where(p1.and(p2))
.using(manager).execute()
.then(getSucceeded)
.fail(getFailed);
function getSucceeded(data) {
_.each(data.results, function (item) {
arr.push(item);
});
}
function getFailed(error) {
errorObservable("Error retrieving processes: " + error.message);
}
}
}