1

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);
        }
    }
}
4

1 に答える 1