What's continuation?
continuation这个词1直不知道怎么翻译最好。大概就是连续的,持续的意思。在编程的领域中,是指那些以同步的方式编写异步的程序。本来应该中断当前执行序列等待某些事件(如用户输入等)发生的程序,可能要为每次异步调用的返回设置1个相应结果的回调方法。而在continuation方式的编程中可以将这些异步处理完全屏蔽在底层。1次异步调用就如同调用1个普通函数1样,整个流程完全可以写在1个函数中(当然最好不要)。
Sample
举个例子,假设现在有1个登录流程需要实现:首先渲染登录界面当用户输入并提交时,调用另外1段程序,检查用户输入,处理登录的结果。代码可能会是这样:
function startLogin(){然后在适当的时候checkLogin将被调用,处理login的检查和转向。如果用continuation的方式写,代码就会明了的多了:
renderLogin();
}
function checkLogin(String username, String pwd){
if (isOk(username, pwd)){
renderHome();
} else {
renderError();
}
}
//rewrite in continuation way当程序执行到getLogin方法时,由于这是1个长时间的过程,程序将被continuation的实现框架中断,等待输入。
function login(){
renderLogin();
loginData = getLogin();
if (isOk(loginData.username, loginData.pwd)){
renderHome();
} else {
renderError();
}
}
当输入返回时,再从中断处继续执行,将结果返回给loginData。在整个执行过程中程序员看到的只是1段连续执行的代码,所有需要异步的操作,由continuation的实现框架去处理。
Why
上面的例子很简单,只是展示continuation风格的编码方式,对于复杂的项目,其中1个流程中可能涉及到数10个表单,对几10种不同的输入进行处理。如果用异步的方式编写代码,越来越多的函数(或类)散步在项目的目录树中用于处理各种可能输入的,代码的检查和修改也就越来越困难。
continuation就是用来解决这些问题的,当项目中需要很多异步调用完成时,使用continuation的方式编写代码,逻辑和流程会变得非常清晰。
Where
continuation可以用在任何需要解决异步调用问题的场合,在server端和client端都会用到。
- javaFlow是1个控制java代码执行流程的包,可以将代码执行的某个位置和上下文记录下来,中断当前运行,执行其他操作,当条件适合的时候,再回复到中断的位置继续执行。
- JAUJava实现的continuation
ajax就像它的名字,通过javascript实现的异步调用。RIA盛行,client端的异步调用也多起来了,多到受不了之前,可以试试continuation的方式来写RIA。
Narrative
Narrative对javascript的持续异步执行的实现,因为javascript实际上是个脚本语言,没有java那么强大,narrative实现异步的方式实际上是重写了所有需要异步执行的代码(几乎就是所有的function了),narrative中用到了1个mozilla下的javascript解析器的项目。
重写之后的javascript代码,为函数中每个必要的步骤设置1个标志(1个数字),以便中断后从中断点继续执行。
重写后,javascript函数中所有的局部变量会被替换成某个和函数相关的对象的属性,也是为了中断后不丢失程序的上下文。
重写后的函数可能在调用异步过程的时候被中断,中断时函数会真正的退出,当异步调用返回结果(或达到其他某个条件时),函数重新被调用,但是会直接跳到上次中断处,这是通过重写时设置的数字标识实现的。函数中用到的局部变量,也从会某个对象中重新取得。
为了支持异步调用,narrative的源代码(重写前的代码)中对需要异步执行的函数调用提供了1个新的语法:
someFunc->(arg1, arg2...)
表示这个函数要以异步的方式执行,其中可能会中断。这也是narrative中的javascript代码唯一与普通javascript不同的地方。
没有评论:
发表评论