{"id":19785239,"url":"https://github.com/hezedu/sas","last_synced_at":"2025-04-30T23:30:20.456Z","repository":{"id":26719258,"uuid":"30176673","full_name":"hezedu/sas","owner":"hezedu","description":"一个可递归的异步控制库","archived":false,"fork":false,"pushed_at":"2019-02-14T03:29:51.000Z","size":454,"stargazers_count":4,"open_issues_count":5,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-18T14:23:37.497Z","etag":null,"topics":["async","javascript","recursive"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hezedu.png","metadata":{"files":{"readme":"README-2.1.0.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-02-02T07:49:08.000Z","updated_at":"2022-09-26T09:44:06.000Z","dependencies_parsed_at":"2022-06-28T18:11:26.205Z","dependency_job_id":null,"html_url":"https://github.com/hezedu/sas","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hezedu%2Fsas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hezedu%2Fsas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hezedu%2Fsas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hezedu%2Fsas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hezedu","download_url":"https://codeload.github.com/hezedu/sas/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251409011,"owners_count":21584774,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","javascript","recursive"],"created_at":"2024-11-12T06:14:00.910Z","updated_at":"2025-04-30T23:30:20.114Z","avatar_url":"https://github.com/hezedu.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sas2.1.0\nS代表sync,AS代表async。Sas 是一个javascript处理(同/异)步控制流.\n\n使用sas寻找磁盘最深处:\n\n![image](https://github.com/hezedu/SomethingBoring/blob/master/sas/140deep.png?raw=true)\n\n# 安装\n[Node.js](http://nodejs.org)： `npm install sas`\n\n浏览器直接src,不支持IE8.\n\n# API\nsas(tasks);\n\nsas(tasks,opts);\n\nsas(tasks,opts.allEnd);\n\nsas(tasks,opts.iterator,opts.allEnd);\n\n---------------------------------------\n\n## tasks\n\n包含三种元素:\n\n___Array___代表同步.\n```javascript\n//同步挨个执行\n[task1,task2,task3] \n```\n\n___Object___代表异步.\n```javascript\n{ //异步同时执行\n  'key1': task1,\n  'key2': task2,\n  'key3': task3\n}\n```\n\n___Function___代表任务.\n```javascript\nfunction(cb){\n  cb();\n}\n```\n\n---------------------------------------\n\n### 嵌套示例:\n```javascript\n//同步内异步\n[{\n  'key1': task1,\n  'key2': task2\n}, {\n  'key1': task3,\n  'key2': task4\n}]\n\n//异步内同步\n{\n  'key1': [task1, task2],\n  'key2': [task1, task2]\n}\n```\n多重嵌套:[mktree](https://github.com/hezedu/sas/blob/master/demo/mktree.js)\n\n---------------------------------------\n\n## cb\n\n```javascript\n////////////后面一直用到的\nvar sas = require('../sas-debug');\nvar rdom = function() { //随机time\n  return Math.random() * 1000;\n}\nvar test = function(param){\n  return function(cb){\n    setTimeout(function(){\n      cb(param);\n    },rdom());\n  }\n}\nvar end = function(cb){\n    cb('end');\n    console.log(this);\n  }\n/////////////////////////////////\n\n\nsas([\n  test(123),\n  test(null), \n  end\n]);\n\n//////////////////////////////////////\nlog结果:\n[ 123, null, 'end' ]\n//\n```\n他有一些实用的魔法字参数:\n\n`cb('$STOP',err)`\n\n中止当前程序.同步的会立刻停住,异步的返回结果不做任何处理.\n\nerr将会传给`opt.allEnd`（如果有的话） ,作为第一个参数。opt.allEnd本文见最后。\n```javascript\n\n\nsas([\n  test('aaa'),\n  test('$STOP'),\n  test('不会被执行')\n]);\n```\n`cb('$END')`\n\n中止 `this`\n```javascript\nsas([{\n    key1: [test('aaa'), test('$END'), test('bbb')], //test('bbb')将不会执行.\n    key2: [test('$END'), test('aaa'), test('bbb')]//后面两都不会执行\n  },\n  end\n]);\n\n\n//////////////////////////////////////\nlog结果:\n[ { key1: [ 'aaa', [Function], [Function] ],\n    key2: [ [Function], [Function], [Function] ] },\n  undefined ]\n```\n`cb('$RELOAD',param)`\n\n会重载当前任务为 param || 它自身.\n```javascript\nvar test = {\nkey1:test('key1'),\nkey2:test('key2')\n}\n\n\nsas([\n  function(cb) {\n    cb('$RELOAD',test);\n  },\n  end\n]);\n\n\n//////////////////////////////////////\n//log结果\n[ { key1: 'key1', key2: 'key2' }, undefined ]\n\n```\n`cb('$THIS=',result)`\n\n将结果直接保存到 `this`里!\n```javascript\n\nsas([{\n    key1: [test('aaa'),\n\n      function(cb) {\n        cb('$THIS=', '我直接存到this里拉!');\n      },\n\n      test('bbb')\n    ],\n    key2: [test('aaa'), test('bbb')]\n  },\n  end\n]);\n\n//////////////////////////////////////\n//log结果\n[ { key1: '我直接存到this里拉!', key2: [ 'aaa', 'bbb' ] }, 'end' ]\n//好处是少了一层嵌套,用起来方便.\n```\n`cb('$GO')`\n\n跳转,只能在数组里用，`cb('$GO',-1)` 后退一步.\n`cb('$GO',2)`  跳过下一个.\n\n最后别忘了一定要cb哦.\n\n---------------------------------------\n\n\n\n\n## t\n### t是一个智能对象.像this但又不是this,所以叫t.\n\n不用它的时候不要选,选了它一定要用.\n\n`t.index`: 返回当前任务的index;\n\n`t.parent` 返回`this`的父级\n\n`t.pIndex`: 返回`this`的父级的index\n\n`t.Sparent` 返回`this`的第一个Sync父级\n\n`t.SpIndex` 返回`this`的第一个Sync父级index\n\n`t.path`: 返回当前任务到根的索引数组.\n\n`t.fspath()`: 返回一个去掉数字索引的数组,像文件路径,所以叫fspath\n\n`t.push(tasks)`: 将一些元素添加到`this`里,以继续运行.只能数组元素用.\n\n\n\n\n\n---------------------------------------\n\n\n\n\n\n## opts\nopt.iterator 用来替换每一个`tasks`中不是function的基础单位.\n结构为:\n```javascript\nopt.iterator=function(param){\n  return function(cb,t){//return一个task.\n    cb();\n  }\n}\n```\n\nopt.allEnd 只在返回cb('$STOP') 或程序完全结束时触发.\n```javascript\nopt.allEnd(err,result){ //国际惯例,第一个err,第二个结果\n\n};\n```\n\nopt.process 任务进度。\n```javascript\nopt.process= function(count1,count2){\n  //count1 已轮询的计数\n  //count2 已回调的计数.\n}\n```\n示例：[前端进度条](https://github.com/hezedu/sas/blob/master/demo/process.html)\n\n\n\n\n\n\n\n\n---------------------------------------\n\n\n\n\n\n# 追踪\n\n使用项目目录下：___sas-debug.js___将会显示如下追踪:\n\n![image](https://github.com/hezedu/SomethingBoring/blob/master/sas/saslog.png?raw=true)\n\n其中白色为Sync,灰色为Async.\n\n\n\n\n\n\n\n---------------------------------------\n\n\n\n\n# 项目说明\n项目目录下:\n\n___sas.js___   主要的.\n\n___sas-debug.js___   debug版,默认会生成log,影响性能.用于开发和示例.\n\n___sas-min.js___   压缩好的,前端用.\n\n___/demo___   示例文件夹.\n\n\n\n\n---------------------------------------\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhezedu%2Fsas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhezedu%2Fsas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhezedu%2Fsas/lists"}