0

我有两个 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. 如何将服务器端方法的结果作为参数传递给客户端函数?

4

2 回答 2

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 调用将被执行。

编辑:回答附加问题:

如果您希望通过第一个回调计算传递给调用的“id”,则displayAnnotation只能在第一个回调执行后生成该调用。该值可以通过临时变量或实例变量(因为闭包)在 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)))
于 2012-06-26T06:01:02.350 回答
0

XMLHttpRequest 对象有一个onreadystatechange事件。当对象达到readyState4 时,您可以通过将匿名函数绑定到该事件来发出第二个 AJAX 请求。如果您想要更详细的回复,请发布您尝试过的内容和一些代码,SO 社区将非常愿意为您提供更详细的答案。

于 2012-06-26T00:41:24.183 回答