2012-02-29 71 views
1

我正在向现有功能添加一些功能。我需要在当前例程中插入一个额外的步骤。我知道如何去第二个函数,但是我不知道如何在第二个例程完成后返回主函数。如何编写一个JS函数来执行某些操作,然后在该过程完成后返回?

function step1(){ 
    perform ajax call to see if student is assigned to a project 
    step1_subfunction() 
    // wait here until step1_subfunction is done 
    do some more stuff with response from user 
} 

function step1_subfunction(){ 
    prompt user via jQuery dialog, 'Add or move employee to the project?' 
    // return to step1 with answer returned from user and resume 
} 

我会谷歌这个,但我不知道这个“过程”是否有一个名称。回到COBOL的日子里,我们称之为gosub。

更新: 步骤1执行ajax调用以查看员工是否已分配给项目。如果response.status ='Assigned',则用户将通过jQuery对话框“您想要将员工复制或移动到该项目吗?”来询问用户。 jQuery对话框将是step1_subroutine。答案将被传回给step1函数。 step1的其余部分仅仅是将一个值放置在“复制”或“移动”的隐藏文本字段中。

+1

只要'step1_subfunction'不执行任何异步代码,这就是它的工作原理 – scibuff 2012-02-29 17:07:51

+0

@scibuff像偶然的ajax调用一样长? – HPWD 2012-02-29 17:11:05

+0

@dlackey:是的。它'step1_subfunction'包含一个AJAX调用,这是行不通的。 – 2012-02-29 17:12:00

回答

0

你有什么将执行你正在描述的内容,但可能不会使用户的数据可用于执行step1()函数,而不会返回函数step1_subfunction()。下面我修改了你的示例代码来演示返回值的传递。

function step1(){ 
    //do some stuff 
    var returnValFromFunction = step1_subfunction(); 
    // wait here until step1_subfunction is done 
    // Now use returnValFromFunction, it contains the information from the user 
    do some more stuff with response from user 
} 

function step1_subfunction(){ 
    prompt user for some information 
    // return to step1 with information returned from user and resume 
    return userResponse; 
} 
+0

我读到了使用“返回”,这看起来是我所需要的。谢谢,@波 – HPWD 2012-02-29 18:47:33

0

你写的东西应该可以工作 - javascript是单线程的,所以你试过了吗?

Javascript没有专门的子程序,只是创建一个返回并忽略结果的函数,就像你所做的那样。当第二个例程完成时,范围和执行将在第一个函数中继续。

+0

我写出了骨架,它/出现/是单线程的,但在我开始调整这个现有的过程之前,我想确认我的逻辑是正确的。 – HPWD 2012-02-29 17:12:06

0

什么都不做。

你正在努力实现只是一个“函数调用”

所以它会自动返回到它的调用者“堆栈帧”执行一次。

0

您可以使ajax对象同步 - IE,代码将继续,直到它得到一个响应。这是open的第三个参数(true是异步的,false是同步的)。

xmlhttpobject.open('POST', 'url', false); 

有些情况下同步呼叫很好,但应尽量避免。

另一种替代方法,可能需要在代码中进行一些逻辑更改,但从长远来看最好,是绑定onReadyStateChange事件。这会在每次xmlHttpRequest对象的状态发生更改时触发 - 您可以检查状态是否为200,readystate是否为4以确保请求已成功完成并成功完成。

Here's更好的参考。祝你好运。

相关问题