|
1
8
您可以利用JS的一个称为闭包的特性。结合一个非常常见的JS模式,称为“延续传递样式”,您就有了自己的解决方案。(这两个东西都不是JS的原版,但是在JS中被大量使用)。
“延续传递样式”是指回调。每个函数调用回调(continue)并给出结果,而不是返回值。 然后您可以轻松地将两个连接在一起:
嵌套的匿名函数可以从它们所在的范围“看到”变量。所以不需要使用特殊属性来传递信息。 更新 为了澄清,在您的问题代码片段中,很明显您大致是这样想的:
(然后作为一个复杂的因素,循环必须使用
你不需要这样做! 不要让第一个函数在完成时设置属性,而是让它调用一个函数。 要完全清楚地说明这一点,让我们重构原始代码:
[
更新2
顺便问一下,那里有一个虫子。复制的当前值
我们所要做的就是告诉函数完成后要调用什么,并去掉属性设置:
现在不需要你的“电话检查”或是你的特别服务了
另一个优点是我们可以将不同的参数传递给第二个函数。使用您的方法,相同的参数将传递给这两个参数。 例如,第一个函数可能会对Ajax服务进行两次调用(使用jquery实现简洁性):
在这里,
然后我们可以用另一个操作链接这个:
或者我们可以(再次)使用匿名函数:
因此,通过像这样链接函数调用,每一步都可以在可用时将信息转发到下一步。 通过让函数在完成后执行回调,您可以摆脱对每个函数内部工作方式的任何限制。它可以执行Ajax调用、计时器等等。只要向前传递“continue”回调,就可以有任意数量的异步工作层。 基本上,在异步系统中,如果您发现自己编写了一个循环来检查一个变量,并发现它是否改变了状态,那么在某个地方就出现了问题。相反,应该有一种方法来提供在状态更改时将调用的函数。 更新3 我在评论中看到你提到的其他地方,实际问题是缓存结果,所以我解释这一点的所有工作都是浪费时间。这是你应该提出的问题。 更新4 最近我写的 a short blog post on the subject of caching asynchronous call results in JavaScript . (更新4结束) 另一种分享结果的方法是提供一种方法,让一个回调“广播”或“发布”给几个订户:
所以:
然后让一些缓慢的操作发布其结果:
当一个呼叫结束时,它将呼叫所有三个订户。 |
|
|
2
5
对这个“准备好就打电话给我”问题的明确回答是 回拨 . 回调基本上是一个分配给对象属性的函数(如“onload”)。当对象状态改变时,调用函数。例如,此函数向给定的URL发出Ajax请求,完成后发出尖叫:
当然,这不够灵活,因为我们可能希望对不同的Ajax调用使用不同的操作。幸运的是,javascript是一种函数语言,因此我们可以简单地将所需的操作作为参数传递:
第二个函数可以这样使用:
根据注释,这里有一个如何在对象中使用Ajax的示例
其思想是在事件处理程序中“关闭”(别名)“this”,以便进一步传递它。 |
|
|
3
1
欢迎来到这里!顺便说一句,你被认为是个十足的笨蛋,你的问题完全不清楚:)
这是基于@daniel关于使用continuations的回答。它是一个简单的函数,将多个方法链接在一起。很像管道
要使用它,请从创建对象
要与Ajax请求一起使用,请将链接函数作为成功回调传递给xmlhttpRequest。
重要的是,每个函数都依赖于前一个函数的输出,因此必须在每个阶段返回一些值。
这只是一个建议——赋予检查数据是否在本地可用或必须发出HTTP请求的责任将增加系统的复杂性。相反,您可以有一个不透明的请求管理器,就像
这是一个
sample
要使用它,您可以打电话给
|
|
|
4
1
我已经解决了,现在看来效果很好。我会在整理完代码后再发布。同时,非常感谢您的帮助! 更新 尝试了WebKit(Safari、Chrome)、Mozilla和Opera中的代码。似乎工作得很好。期待任何回复。 更新2 我更改了tieexc()方法以集成Anurag的链接函数调用语法。现在,通过将函数作为参数传递,可以在完成检查时调用任意多个函数。 如果您不想阅读代码,请尝试: http://jsfiddle.net/UMuj3/ (顺便说一句,jfiddle是一个非常整洁的站点!). JS代码:
HTML :
|
|
5
0
一个非常简单的解决方案是使第一个Ajax调用同步。它是可选参数之一。 |