在Flex中,对远程服务的访问都是异步的,所谓“异步”就是方法调用之后,当前线程并不阻塞以等待调用结果的返回,而是继续执行下一行代码。Flash Player中会有其他线程守候远程方法调用结果。当远程方法调用结果(可能调用成功,也可能因某种原因失败)返回后,守候线程会以“事件”的形式通知应用进行相应的处理。因此,远程方法调用结果都是在调用结果相关的事件侦听器中处理的。
异步调用非常容易理解,笔者在这里总结了项目中异步调用所带来的两个常见问题,希望引起读者的注意,在项目开发的早期予以重视。
1.异步调用导致模型数据不一致
在Flex中进行远程调用时,远程调用结果未返回前,Flex不会阻塞用户当前的线程,因此用户的操作会导致以不同参数多次对同一个远程调用。由于无法保证这些远程调用结果的返回顺序,因此可能会造成调用参数与得到的最后结果不匹配,这就造成了数据模型的不一致。图2-6所示界面就是一个典型的例子,这个人机界面主要完成用户档案管理功能,界面左侧是一个用户列表,右侧是用户列表中当前所选用户记录的档案信息面板。为了提高性能,将这个功能设计为当操作者通过鼠标或者键盘选中用户列表中的一条用户记录后才调用远程方法从服务器中获取用户的档案信息。由于开发者没有考虑到异步调用的问题,这个界面的第一个版本出来之后,一个非常有趣的现象出现了:当测试者快速点击左侧的用户列表中不同的用户记录时,窗口右侧的用户档案面板上的用户档案与最后所选择的用户不一致,出现了“张冠李戴”的现象。
2.异步调用导致用户反复(误)操作
在Flex中进行远程调用时,远程调用结果未返回前Flex不会阻塞用户当前的线程,用户还可以继续操作当前的人机界面。如果远程调用比较耗费性能,需要等上几秒钟才能返回。如果人机界面上没有执行相应的处理,那么有些性急的用户以为自己所做操作(比如按钮的点击)没起作用(因为他没有立即看到结果),因此可能会不停地执行这个操作。比如,不停地点击同一个按钮。这就使得本来耗费性能的服务被请求多次。图2-7所示的窗口就是一个典型的范例,这个窗口完成了一个统计功能,当用户点击“统计”按钮后调用远程服务进行统计,并将结果返回到数据表格中。由于开发者没有考虑到异步调用的问题,当操作者点击统计按钮后,表格中没有立即出现统计数据,因此操作者误以为按钮失效,于是连续点击“统计”按钮多次,导致向服务器发送了多次统计请求,严重地浪费了服务器的资源。
对于这两个问题,通用的解决方案就是在执行远程调用前弹出一个有模式窗口阻止用户继续在原界面上进行鼠标键盘操作,同时显示提示文字或进度条。
异步调用非常容易理解,笔者在这里总结了项目中异步调用所带来的两个常见问题,希望引起读者的注意,在项目开发的早期予以重视。
1.异步调用导致模型数据不一致
在Flex中进行远程调用时,远程调用结果未返回前,Flex不会阻塞用户当前的线程,因此用户的操作会导致以不同参数多次对同一个远程调用。由于无法保证这些远程调用结果的返回顺序,因此可能会造成调用参数与得到的最后结果不匹配,这就造成了数据模型的不一致。图2-6所示界面就是一个典型的例子,这个人机界面主要完成用户档案管理功能,界面左侧是一个用户列表,右侧是用户列表中当前所选用户记录的档案信息面板。为了提高性能,将这个功能设计为当操作者通过鼠标或者键盘选中用户列表中的一条用户记录后才调用远程方法从服务器中获取用户的档案信息。由于开发者没有考虑到异步调用的问题,这个界面的第一个版本出来之后,一个非常有趣的现象出现了:当测试者快速点击左侧的用户列表中不同的用户记录时,窗口右侧的用户档案面板上的用户档案与最后所选择的用户不一致,出现了“张冠李戴”的现象。
2.异步调用导致用户反复(误)操作
在Flex中进行远程调用时,远程调用结果未返回前Flex不会阻塞用户当前的线程,用户还可以继续操作当前的人机界面。如果远程调用比较耗费性能,需要等上几秒钟才能返回。如果人机界面上没有执行相应的处理,那么有些性急的用户以为自己所做操作(比如按钮的点击)没起作用(因为他没有立即看到结果),因此可能会不停地执行这个操作。比如,不停地点击同一个按钮。这就使得本来耗费性能的服务被请求多次。图2-7所示的窗口就是一个典型的范例,这个窗口完成了一个统计功能,当用户点击“统计”按钮后调用远程服务进行统计,并将结果返回到数据表格中。由于开发者没有考虑到异步调用的问题,当操作者点击统计按钮后,表格中没有立即出现统计数据,因此操作者误以为按钮失效,于是连续点击“统计”按钮多次,导致向服务器发送了多次统计请求,严重地浪费了服务器的资源。
对于这两个问题,通用的解决方案就是在执行远程调用前弹出一个有模式窗口阻止用户继续在原界面上进行鼠标键盘操作,同时显示提示文字或进度条。