今天一同事问我Jscex怎么没有stop啊?

异步任务就像断线的风筝,我们没法让它说停就停,但是我们在放飞它之前,可以装个定时炸弹。

通常我们可以这样退出一个异步任务:

       var xxxAsync = eval(Jscex.compile("async", function () {while (condition) {....dosomething....        $await(Jscex.Async.sleep(1000));}}))

通过condition判断是否退出异步任务。或者等同于下面这种方式:

       var xxxAsync = eval(Jscex.compile("async", function () {while (true) {if(condition)break;....dosomething....        $await(Jscex.Async.sleep(1000));}}))

这两种方式的效果是一模一样的。

下面这种方式有个好处就是可以做一些初始化设置什么的:

       var xxxAsync = eval(Jscex.compile("async", function () {while (true) {if (condition) {//dosomethingbreak;}//dosomething      $await(Jscex.Async.sleep(1000));}}))

后来,同事又提供了一个要跳出循环的场景

       var xxxAsync = eval(Jscex.compile("async", function () {while (true) {for (i in XXX) {if (condition) { //要在这里跳出最外层的循环}}//dosomething      $await(Jscex.Async.sleep(1000));}}))

所以就只能这样:

       var xxxAsync = eval(Jscex.compile("async", function () {while (true) {for (i in XXX) {if (condition) {//要在这里跳出最外层的循环breakTag = true;}}if (breakTag) break;//dosomething      $await(Jscex.Async.sleep(1000));}}))

后来同事又提供了一个BT的场景:

       var countAsync1 = eval(Jscex.compile("async", function () {while (true) {for (i in XXX) {if (condition) {//要在这里跳出最外层的循环}}$await(Jscex.Async.sleep(1000));}}))var countAsync2 = eval(Jscex.compile("async", function () {while (true) {for (i in XXX) {if (condition) {//要在这里跳出最外层的循环}}     $await(Jscex.Async.sleep(1000));}}))var executeAsyncQueue = eval(Jscex.compile("async", function () {while (true) {$await(countAsync1())$await(countAsync2())$await(Jscex.Async.sleep(1000));}}))executeAsyncQueue().start();

相当于要在异步队列中跳出最最外层的循环。

我给出的方案还是breakTag

       var executeAsyncQueue = eval(Jscex.compile("async", function () {while (true) {$await(countAsync1())$await(countAsync2())if (breakTag) break;$await(Jscex.Async.sleep(1000));}}))

同理这个场景也用tag:

        var xxAsync = eval(Jscex.compile("async", function () {while (true) {//dosomething$await(xxxAsync())if (breakTag) break;$await(Jscex.Async.sleep("1000"));}}))var xxxAsync = eval(Jscex.compile("async", function () {if (condition) {breakTag = true;}$await(Jscex.Async.sleep("1000"));}))

所以:Jscex没有必要提供stop,你说呢?

Jscex.Async.Task = function (delegate) {this._delegate = delegate;this._handlers = [];this.status = "ready";
}
Jscex.Async.Task.prototype = {start: function () {if (this.status != "ready") {throw 'Task can only be started in "ready" status.';}var _this = this;this.status = "running";this._delegate["onStart"](function (type, value) {if (_this.status != "running") {throw ('Callback can only be used in "running" status.');}if (type == "success") {_this.result = value;_this.status = "succeeded";} else if (type == "failure") {_this.error = value;_this.status = "failed";} else if (type == "cancel") {_this.status = "canceled";} else {throw ("Unsupported type: " + type);}_this._notify();});},cancel: function () {if (this.status != "running") {throw 'Task can only be canceled in "running" status';}var onCancel = this._delegate["onCancel"];if (onCancel) onCancel();this._notify();},_notify: function () {var handlers = this._handlers;delete this._handlers;for (var i = 0; i < handlers.length; i++) {handlers[i](this);}},addListener: function (handler) {if (!this._handlers) {throw ('Listeners can only be added in "ready" or "running" status.');}this._handlers.push(handler);}
};

Jscex没有xxxAsync().stop()怎么办?相关推荐

  1. BIOS/UEFI基础——Protocol介绍

    简要说明 Protocol是UEFI中的一个重要概念(事实上<UEFI SPEC>中有超过70%的内容都是在讲Protocol),下面简单说明下: 1. 首先,非常重要的一点,Protoc ...

  2. 上周末Jscex项目介绍的幻灯片

    上周末,在风景秀丽的浙江大学校园内,举行了NodeParty杭州站的活动.我在活动上结合Node.js项目对Jscex进行了简单介绍,包括其设计目的,设计原则,使用方式,高级模式,组成部分等等.在场的 ...

  3. javascript异步编程系列【八】--Jscex版火拼俄罗斯

    一.简介 俄罗斯方块(Tetris, 俄文:Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名.俄罗斯方块的基本规则是移动.旋转和摆放游戏自动输出 ...

  4. javascript用jscex画圆

    在支持html5的浏览器中执行下面代码: <!DOCTYPE HTML> <html> <body> <canvas id="myCanvas&qu ...

  5. javascript异步编程系列【一】----用Jscex画圆

    一.简介 关注老赵的jscex很久了,jscex利用eval(str)的无限可能,从"$async" 到"async",从不支持if else 等 到支持 if ...

  6. .NET 4.5 基类库中的新增功能

    1. 简化的异步编程 C#和VB都支持了新的async & await语法以简化异步编程,.Net Framework中也相应增加了相关的函数以辅助.一个比较醒目的变化就是在IO操作中多了许多 ...

  7. C# 高性能 TCP 服务的多种实现方式

    哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C# 编写 TCP 服务的花样姿势!>. 本篇文 ...

  8. 初识JavaScript Promises

    JavaScript有很多槽点,嵌套回调怕是千夫所指. 很久之前,我一直使用async来处理JavaScript异步编程中的嵌套回调问题.当然我也大概的了解过一些其它旨在解决这些问题的类库,诸如Eve ...

  9. JavaScript中的异步梳理(0)

    JavaScript中有大量异步操作,首先可以看看JS中什么东西会产生异步(这里先只考虑浏览器里的情况): Ajax(XMLHttpRequest) Image Tag,Script Tag,ifra ...

最新文章

  1. 词频统计-------------web版本
  2. NetLink Communication Mechanism And Netlink Sourcecode Analysis
  3. [Array]Pascal's Triangle II
  4. GDCM:gdcm::PersonName的测试程序
  5. pythonsys标准_python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出...
  6. c语言中typeof关键字
  7. Java线程类核心方法
  8. 安装了opencv,怎么一直报错:找不到CAP_PROP_FRAME_COUNT
  9. 在线解析下载微软官方商店离线安装包
  10. 微信推送早安教程(一)
  11. html5怎么唤起支付宝支付,H5唤起支付宝支付
  12. 我用css精灵图拼接了自己的英文名字,不会还有人不知道精灵图技术吧?
  13. 鸿蒙真机运行调试步骤
  14. 公司企业邮箱怎么注册开通?
  15. android逆向分析腾讯微视研究无限循环视频嵌套滑动不中断的实现方式
  16. Zookeeper基础笔记——从小白到入门
  17. c++ 摇摆序列 (贪心+状态自动机)
  18. ElasticSearch实战(七)-BKD-Tree 多维空间树算法(范围查询算法)
  19. 三维图像投影变换——平行投影
  20. sqlite 表的列增加,修改,删除及表的重构和去重操作

热门文章

  1. 伤感!!!!!!!!!!!!!!!
  2. 考研计划安排表怎么在手机便签上记录?
  3. kuangbin 最小生成树专题 - ZOJ - 1586 QS Network (朴素 Prim算法 模板题)
  4. 【SpringCloud】Could not find artifact org.springframework.cloud:spring-cloud-starter-xxx
  5. 图片文件压缩并上传至阿里云OSS
  6. Java学习—初入Java
  7. ASEMI可控硅模块MTC110-16为何能得到大家的青睐
  8. 国夜景最美丽的十大城市
  9. 【第五章】综合实例:实现图片传送带
  10. 各种艺术字、图片在线制作