【发布时间】:2014-02-27 13:16:27
【问题描述】:
我仍在努力理解这一切,但显然我错过了一些基本概念。
在我的代码中,我有一个场景,我想连续调用几个函数,当它们全部完成后,用一个完成例程将其包装起来,在该例程中计算小计并更新饼图。
虽然我称自己的函数不是异步的,但它们确实包含 ajax 调用,因此我想在计算总计和更新图表之前等待所有这些调用完成。
所以我尝试这样做:
var fnArray= [];
fnArray.push(genericCalc("use_", true, false, false));
fnArray.push(doArticleImpacts(false));
fnArray.push(genericProjectCalc("tpD2C_", false, false));
fnArray.push(genericCalc("eol_", true, false, false));
fnArray.push(calcPackaging(false));
var calcPromise = Q.all(fnArray);
return calcPromise
.then(calcsDone)
.fail(calcsFailed);
function calcsDone() {
calcTotals();
setChart(selectedRow());
}
function calcsFailed() {
logger.logError("Failure in calculations", "", null, true);
}
...但是使用上面的代码并使用在“return calcPromise”行停止的脚本调试器,fnArray 设置为“0:undefined, 1:undefined, 2:Object, 3:undefined, 4 :Promise" 甚至在承诺被激活之前。
我知道这显然与我的功能有关,但我真的不明白我需要做些什么不同的事情。功能都略有不同,但基本上是这样的:
var genericCalc = function (calcPrefix) {
var res_Array = ko.observable(); //holds returned results
prjArticleArray.forEach(function (thisArticle) {
var calcPromise = calcEOL(res_Array, thisArticle); //another function containing async ajax call
return calcPromise
.then(calcsDone)
.fail(calcsFailed);
function calcsDone() {
//do calculation subtotals here and set a knockout observable value
}
function calcsFailed() {
logger.logError("Failure in " + calcPrefix + "calculation", "", null, true);
}
});
};
是什么让我想用于 Q.all 的数组中的一些函数“未定义”、一些“对象”和一些“承诺”?我调用的函数的“calcsDone”部分是否必须有“Q.resolve”?
我在 stackoverflow 上看到过类似的其他问题/答案,但它们似乎总是直接调用异步调用,而我在承诺中堆积的第一级函数不是......我应该不是将此结构用于非异步调用,还是只是在我的函数调用中添加“setTimeout”以使其异步?
【问题讨论】:
-
您的
genericCalc函数没有返回任何内容。所以它在fnArray中永远是未定义的;
标签: javascript jquery ajax asynchronous promise