我有两个Ajax调用。我需要确保在这两个调用之间执行JS函数。
是否可以通过AJAX响应触发客户端JS函数的执行?或者你会怎么做这件事?
编辑我的代码在完成第一个答案(onComplete
)的建议之后:
^ (html jQuery ajax
callback: [ :text | id := self createNewAnnotation: text ]
value: (self html jQuery: '#annotationText') value;
onComplete: ((JSStream on: 'displayAnnotation("', id, '")'),
(self html jQuery ajax
callback: [ :text | finalText := text ]
value: (self html jQuery: '#text') html)
);
这应该做什么:在第一次回调时,#annotationText
字段的值传递给createNewAnnotation
,它保存注释并返回ID。
接下来,我想将该ID传递给客户端JS函数displayAnnotation()
。
在此示例中,这仍然有效,因为JSStream on:
周围的代码不在块中,因此初始值为id
。如何将服务器端方法的结果作为参数传递给客户端函数?
答案 0 :(得分:2)
在Seaside中,您可能会使用jQuery绑定来执行ajax调用。如果你想确保链接两个ajax调用并在其间执行一些其他JS代码,代码将遵循以下几行:
renderContentOn: html
html span
onClick: (html jQuery ajax
callback: [...1st ajax callback...];
onComplete: ((JSStream on: '... some JS code ...'),
(html jQuery ajax callback: [...2nd ajax callback...]));
with: 'Click this to trigger the calls'.
这将生成一个跨度,单击该跨度将执行第一个ajax调用。如果那个完成,将执行JS代码和第二个ajax调用。
编辑:回答其他问题:
如果您希望第一次回调计算传递给displayAnnotation
调用的'id',则只能在第一次回调执行后生成该调用。该值可以通过临时变量或实例变量(因为闭包)在ajax回调之间传递。以下代码通过onComplete:
显式链接。之后,我举了一个例子,说明了更少的ajax调用。
^ (html jQuery ajax
callback: [ :text | id := self createNewAnnotation: text ]
value: (html jQuery: #annotationText) value;
onComplete:
(html jQuery ajax
script:[:s | s << ((JSStream on: 'displayAnnotation("', id, '")')]
onComplete:
(html jQuery ajax
callback: [ :text | finalText := text ]
value: (html jQuery: #text) html)))
如果您了解Seaside回调的工作原理,您还可以减少ajax调用的次数。总之,始终最后调用产生回调响应的块。这允许在单个调用中对多个回调块进行分组。如:
^ (html jQuery ajax
callback: [ :text | id := self createNewAnnotation: text ]
value: (html jQuery: #annotationText) value;
script:[:s | s << ((JSStream on: 'displayAnnotation("', id, '")')];
onComplete:
(html jQuery ajax
callback: [ :text | finalText := text ]
value: (html jQuery: #text) html)))
答案 1 :(得分:0)
XMLHttpRequest对象有一个onreadystatechange
事件。当对象达到readyState
为4时,您可以通过将匿名函数绑定到该事件来发出第二个AJAX请求。如果您想要更详细的回复,请发布您尝试的内容和一些代码,SO社区将非常愿意为您提供更详细的答案。