当前位置: 首页 > 软件库 > 程序开发 > 常用工具包 >

Ascs

基于 Fiber 实现 async/await 库
授权协议 BSD
开发语言 JavaScript
所属分类 程序开发、 常用工具包
软件类型 开源软件
地区 国产
投 递 者 危飞跃
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Ascs == as C#,基于 Fiber 实现的类似于C# 的 async/await 的库,摆脱 callback 的痛苦。

Promise 大家都懂,但是在 JS 这个这么喜欢做轮子的领域里面不做一个好像对不起自己似的。

Ascs 很简单,就 3 个 API:

  • Ascs.env 相当于声明这是一个异步(async)的环境,在这里面 ascs 才有效

  • Ascs.conv 把一个常规的异步回调函数转换为 ascs 的异步函数,让你告别回调(callback必须要是最后一个参数)

  • Ascs.await 执行 ascsFunction 之后会返回一个 task,使用这个函数 ascs.await(task) 可以等待返回并且获取返回值

下面是一个简单的例子:

function delayToDo(a, b, cb) {
  var result = a + b;
  setTimeout(function() {
    cb(result * result);
  }, 1000);
} 

var delayToDoAsync = ascs.conv(delayToDo);

ascs.env(function() {
  // 一般写法 
  delayToDo(1, 2, function(r) {
     console.log(r);
  });
  // ascs写法,等待返回
  var result = ascs.await(delayToDoAsnc(1, 2));
  console.log(result[0]); // 返回的是数组,相当于是回调函数参数
})();

更多例子可以看 demo

常见问题:

  • 浏览器能用吗?

        做的时候没想过浏览器,我又不是前端。想前后端兼容的建议用wind.js啊

  • 和ES6兼容吗?

        可以看看commit的历史,其实曾经想过兼容,但是generator的yield的作用于并不能实现像Lua那种效果,所以还是放弃了。不过由于是基于Fiber实现,基本上node/iojs都可以用。

  • ES7 也有async await,这玩意还有用吗?

        等ES7出来再算吧...ES6都还没全

  • 还有什么要说?

    ascs只是一种尝试,没有什么野心,就是走心,玩玩。另外,相比起实际项目,ascs更加适合用于制作library,可以很方便为你的库提供async/await风格的接口(使用ascs.conv转换一下就好),实际项目改造起来会需要一定工作。

更多请关注 https://github.com/drzunny/ascs

  • QQ交流群:198941541 ascs (https://github.com/youngwolf-project/ascs.git) 前面的as跟asio前面的as意义完全一样,这也从侧面说明了ascs与asio的关系,后面的cs是client/server结构的意思。 ascs是基于asio的cs框架,并不是简单的对asio的封装(事实上asio已经有的东西,我没有做过任何封装),因为asi

  • 社区:198941541 从 Asio 1.25 开始,standalone asio 版本将不再更新,为此ascs只能换到依赖Boost.Asio,于是从ascs 1.8版本开始,它将不再依赖standalone asio。那么当我们升级到ascs 1.8之后,需要一些代码上的改动及注意事项,我总结如下: 一:原来asio::xxxx的地方,需要改成boost::asio::xxxx(除了如下第

  • QQ交流群:198941541 1. 什么是service线程? 它是ascs库使用的工作线程,个数由service_pump::start_service(int)指定,默认8个。可以运行时增加,调用service_pump::add_service_thread(int)即可,如果你想运行时减少,则需要定义宏ASCS_DECREASE_THREAD_AT_RUNTIME,然后调用service

  • QQ交流群:198941541 按理说每个demo都应该像是一个UT test,仅演示一个或者很少许的功能,但由于个人偷懒的原因,想演示得更多,又不想新增加demo工程的个数,造成demo变得巨复杂,感觉使用ascs库比直接使用asio还麻烦,为此专门出几期教程介绍这些demo,很多新接触ascs的朋友,喜欢从demo上修改得到自己想要的功能,本人并不推荐这么做,而是应该把 ascs 简明开发教程

  • 1.安装ASCS 用putty登陆到应用服务器,进入到SWMP目录 sapdev:/software/SWMP/#./sapinst 系统执行,并在命令窗体中告知了一个访问地址: 用命令窗口登陆的,不好访问,需要在浏览器中访问这个地址,然后按照这个安装导航完成安装。 2.配置NFS服务器 在应用服务器 VM 上,应通过 NFS 并使用 rw 和 no_root_squash 选项来共享 /sapm

  • QQ交流群:198941541 解包器必须从 ascs::i_packer继承,i_packer接口定义如下: template<typename MsgType> class i_packer { public: typedef MsgType msg_type; typedef const msg_type msg_ctype; typedef std::list<msg_type> c

  • ASCS HA Please let us know what do you mean by "the PAS can not be accessed", what error did you find or encounter? Please send us below info for further analysis: dev_disp/dev_disp.old from PAS work

  • QQ交流群:198941541 接前一篇:ascs 简明开发教程(1) 那么ascs在后面做了什么,让这个cs程序能快速的搭建起来呢? 首先看server的定义: typedef ascs::tcp::server_socket_base<ASCS_DEFAULT_PACKER, ASCS_DEFAULT_UNPACKER> server_socket; typedef ascs::tcp::se

  • QQ交流群:198941541 如果你不想通过继承重写函数的方式使用ascs库,可以通过回调注册机制来代替,回调包括两类,一类是事件回调(比如on_msg_handle),一类是行为(配置)自定义(比如is_ready)。关于回调注册,在echo_server和client里面有简单的演示,可以参考。下面详细说说使用方法及注意事项: 假如你之前的用法是class your_socket : pub

  • QQ交流群:198941541 异步消息发送函数有 send_msg,send_native_msg,safe_send_msg 和 safe_send_native_msg;同步消息发送需要定义宏ASCS_SYNC_SEND,定义之后你将得到 sync_send_msg,sync_send_native_msg,sync_safe_send_msg 和 sync_safe_send_native

  • QQ交流群:198941541 为了让客户端支持任意条数的连接,我们需要修改一下ascs 简明开发教程(1)里面的代码,用multi_client代替single_client,如下: #include <iostream> #include <ascs/ext/tcp.h> using namespace ascs; using namespace ascs::tcp; using names

  • QQ交流群:198941541 客户端: multi_client + 断线自动重连(此时开不开启对象重用都一样): add_socket -> on_connect -> on_recv_error -> on_close -> after_close -> on_connect -> ... multi_client + 对象重用(关闭自动重连,注意reset是object_pool在重用对象

  • QQ交流群:198941541 以tcp为例,udp和tcp类似(只是类的名字不同),ssl和tcp完全一样,只是命名空间不一样: service_pump相当于asio::io_context,它负责创建(可动态)service线程(调用asio::io_context::run的线程),启停各种service,service_pump和asio::io_context一样,本身与网络编程无关,

  • QQ交流群:198941541 多io_context比单io_context来说,基本上在所有情况下都有性能优势(当然你还是应该在自己的实际生产环境下面做一些调优,以找到最优的io_context数量加service线程数量),多io_context有一些自身特定的要求,罗列如下: 一:需要定义ASCS_AVOID_AUTO_STOP_SERVICE宏(但ascs没办法做静态代码检测,所以你不定

  • QQ交流群:198941541 这次我们再进行一次深入的对象生命周期管理的探讨(这里的对象,其实就是socket),对象生命周期管理是object_pool做的,所以single_client是没有生命周期管理的,那是开发者的事。 object_pool用shared_ptr管理对象,那第一感觉是不需要什么生命周期管理了,因为shared_ptr就是做这个的,但ascs在发起异步调用时,并没有把关

  • QQ交流群:198941541 还记得以前我们说过,数据经过解包器之后(所以我称之为消息)开始派发,派发有三种方式: 1. 重写 virtual size_t on_msg(list<OutMsgType>& msg_can) 虚函数,需要定义ASCS_SYNC_DISPATCH宏,我称之为同步派发,即解包之后消息不放入缓存,而是直接回调on_msg函数(一次解包是可以得到多个消息的,所以输出参数

 相关资料
  • Async/await 是以更舒适的方式使用 promise 的一种特殊语法,同时它也非常易于理解和使用。 Async function 让我们以 async 这个关键字开始。它可以被放置在一个函数前面,如下所示: async function f() { return 1; } 在函数前面的 “async” 这个单词表达了一个简单的事情:即这个函数总是返回一个 promise。其他值将自动被

  • 在第一章节,我们简要介绍了async/.await,并用它来构建一个简单的服务器。本章将更为详细讨论async/.await的它如何工作以及如何async代码与传统的 Rust 程序不同。 async/.await是 Rust 语法的特殊部分,它使得可以 yield 对当前线程的控制而不是阻塞,从而允许在等待操作完成时,其他代码可以运行。 async有两种主要的使用方式:async fn和asyn

  • 用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异步操作。 为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法async和await,可以让coroutine的代码更简洁易读。 请注意,async和await是针对coroutin

  • 我是一名普通的C#开发人员,但偶尔会用Java开发应用程序。我想知道是否有与C#async/await相当的Java?简单地说,java等价物是什么:

  • 我有一个webservice,它加载一些插件并调用它们的过程方法。其中一个插件获取成员列表,并确保它们都包含在MailChimp列表中。 在正常的过程代码中,这不会是一个问题。但是,httpClient上唯一可用的Post方法是PostAsync。对于Async/Await来说,我是相当陌生的,我不确定我的其余代码会有什么影响……特别是因为它涉及到我试图重用httpClient而不是为每个http

  • async/.await 是 Rust 的内置工具,用于编写看起来像同步代码的异步函数。async将一个代码区块,转换为实现称为 Future trait 的状态机。而在同步方法中,调用阻塞函数将阻塞整个线程,Futures 将 yield 对线程的控制权,允许其他Future运行。 要创建异步功能,您可以使用async fn语法: async fn do_something() { ... }

  • 我读到过,在中包含异步是async/await的反模式。下面的代码可以工作,但是我想知道如果没有中的,如何实现相同的结果。 谢了。

  • 笔者在很长一段时间内都使用 koa@1 +(generator|bluebird)+ sequelize 这个组合,这个组合并没有什么问题,也很常见,但是到了滥用的地步,导致后来维护和调试起来都很痛苦。若排除 sequelize 这个我们不得不用的模块,从调试 cpuprofile 角度讲讲为什么笔者认为应该用 async/await + Promise 替代 co + generator|blu