我创建了一个 web api 方法,该方法使用我发布到该方法的 json 对象执行计算。我的理解是 jquery 帖子是异步的?假设是这样,我希望能够将调用此 api 方法的 js 函数的多个调用链接在一起,因为某些调用是顺序关键的。
该异步 api 方法连续调用 80 次。我不想这样做:
asyncMethodCall1(myParams).then(asyncMethodCall2(myParams).then...))
...
因为没有必要像这样链接它们,因为它们都不依赖于另一个并且可以同时运行。但是最后我需要做一些其他的计算,这些计算取决于之前的结果已经完成。
有没有一种方法可以进行一组呼叫,然后是“then”?这仅仅是一个类似的情况:
mySynchronousFunction(params).then(function() {...do other calcs});
function mySynchronousFunction(params) {
asyncmethodcall1(myparams);
asyncmethodcall2(myparams);
asyncmethodcall3(myparams);
...
asyncmethodcall76(myparams);
}
还是我需要在某个地方有一个“setTimeOut”?JavaScript 是我正在尝试学习的东西,现在对我来说有点奇怪!
编辑 1
好吧,我很难过。
我知道这是导致问题的根本原因,但很难找到来自同步语言的人可以遵循和理解的基本介绍性内容。目前我正在处理的资源是这个资源,它似乎有一些意义,但它仍然没有陷入:http ://blog.mediumequalsmessage.com/promise-deferred-objects-in-javascript-pt1-theory-and -语义
目前我有这个:
$.when(
individualImpactCalc('byWeightAndFactor', 'CO2e', articleResults().material_CO2e),
individualImpactCalc('byWeightAndFactor', 'Water', articleResults().material_Water),
individualImpactCalc('byWeightAndFactor', 'pH', articleResults().material_pH),
...lots of other calls in here...
).then(function () {
//do calculation totalling
alert("I'm done!");
}).fail(function() {
alert("Argh! I failed!");
});
...而且它根本无法按我的意愿工作。我从来没有收到警报显示。影响计算已完成,可观察值已更新,我的页面值更改,但没有警报。
我在这里根本缺少什么?
编辑 2
我根本缺少的是调试链式 Promise 的困难!一旦我修复了一个没有冒泡的隐藏参考错误,它实际上就可以工作了。大量通过 javascript 的艰苦步骤终于找到了它。
只是为了在答案组合中添加另一个元素,我使用了 Q 库,因为无论如何这都是在 Durandal/Breeze 中使用的,并且很容易保持代码的一致性。我用 $.when 试了一下,效果也很好。我用 Promise 进行了尝试,但由于“未定义 Promise”而失败。
我的工作Q实现:
var calcPromise = Q.all([
individualImpactCalc('byWeightAndFactor', 'CO2e', articleResults().material_CO2e),
individualImpactCalc('byWeightAndFactor', 'Water', articleResults().material_Water),
individualImpactCalc('byWeightAndFactor', 'pH', )]);
return calcPromise
.then(calcsDone)
.fail(calcsFailed);
function calcsDone() {
alert("all calcs done");
}
function calcsFailed() {
alert("Argh! Calc failure...");
}