gpt4 book ai didi

javascript - 为什么我不能在这个特定函数中添加到我的数组?

转载 作者:行者123 更新时间:2023-11-30 10:28:12 25 4
gpt4 key购买 nike

我有一个函数,在该函数中我循环执行一小组查询,这些查询使用 Breeze.js 返回数据 block 。代码的每一部分都有效,但只有一行(我尝试将查询结果添加到数组中)。我尝试了各种方法,但似乎无法弄清楚为什么它不起作用。

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

这会将每个查询的所有结果输出到控制台,但不会将结果输出到数组。但是,如果我将第二行更改为 var arr = [ 1, 2, 3, 4, 5 ];,那么这些值将反射(reflect)在 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);
}
}
}

最佳答案

啊,异步的经典陷阱。 getSucceeded 被称为异步,这意味着您将它作为回调传递给 EntityQuery,后者将在稍后调用它.

当您的 _.each(sourceArray, ...) 返回时,所有查询都将开始但仍在运行。这些都还没有完成,你的回调也没有被调用。因此,当您将 arr 传递给 outputObservable 时,它仍然没有变化。您应该能够在调试器中注意到这一点:在 outputObservable 之前添加一个 console.log 并且您会看到它将被调用 before任何 console.log(item) 调用。

您只想在所有 异步查询完成时调用outputObservable。我不太熟悉 Breeze 或 underscore.js,但您需要将 execute() 返回的 promise 组合成一个新的 promise。当所有 promise 都已解决时,这个新的promise 就会得到解决,因此您应该为其附加一个then 回调并调用outputObservable

关于javascript - 为什么我不能在这个特定函数中添加到我的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18522504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com