全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
表格存储

异步接口

更新时间:2018-03-08 20:38:16

新建Client

  • 直接创建(即使用Table Store Endpoint新建Client)

    1. Endpoint ep("YourEndpoint", "YourInstance");
    2. Credential cr("AccessKeyId", "AccessKeySecret");
    3. ClientOptions opts;
    4. AsyncClient* client = NULL;
    5. Optional<OTSError> res = AsyncClient::create(client, ep, cr, opts);

    说明:建议您避免使用主账号的AcceessKey来访问表格存储,推荐使用临时令牌或者子账号的AccessKey。如果使用临时令牌STS,上述代码中的Credential对象需要修改为:Credential cr("AccessKeyId", "AccessKeySecret", "SecurityToken");

    配置项的说明参见同步接口

  • 从SyncClient构造

    1. SyncClient& sync = ...;
    2. AsyncClient* async = AsyncClient::create(sync);

表操作

以表操作为例说明异步接口的使用。

准备工作

需要准备两个函数:

  • 请求对象

    listTable的函数签名如下所示:

    1. void listTable(
    2. ListTableRequest&,
    3. const std::tr1::function<void(
    4. ListTableRequest&, util::Optional<OTSError>&, ListTableResponse&)>&);

    第一个参数是可变引用(区别于同步接口,同步接口是不可变引用)。 在listTable()返回之后(这时整个列举表操作并没有完成),传入的ListTableRequest对象可能会被改变或者析构,从而引入一些难以调查的微妙错误。为了避免这类问题,异步客户端会将传入的请求对象里的内容转移(并非复制)到内部保存起来。所以,调用了listTable()之后,传入的请求对象有可能被改变。

  • 回调函数

    回调函数不能返回任何值,接收参数有以下三种:

    • 请求对象。其内容即用户调用listTable()时传入的请求对象。因为回调之后异步客户端也不再需要请求对象,于是以可变引用的方式还给用户的回调函数。这样用户可以将请求对象的内容转移出来。

    • 包装在Optional内的错误对象。如果没有错误,则该对象的present()方法返回false

    • 响应对象。与请求对象类似,响应对象也是以可变引用的方式交给回调函数。如果有错误,响应对象一定是一个合法的对象(可以正常析构),但是其内容是未定义的。

说明:

  • 异步客户端保证每个请求的回调一定会被调用正好一次。
  • 理论上,回调函数有可能在listTable()返回之前被调用。

示例

  1. void listTableCallback(
  2. ListTableRequest&,
  3. Optional<OTSError>& err,
  4. ListTableResponse& resp)
  5. {
  6. if (err.present()) {
  7. // 处理错误
  8. } else {
  9. const IVector<string>& xs = resp.tables();
  10. for(int64_t i = 0; i < xs.size(); ++i) {
  11. cout << xs[i] << endl;
  12. }
  13. }
  14. }
  15. void listTable(AsyncClient& client)
  16. {
  17. ListTableRequest req;
  18. client.listTable(req, listTableCallback);
  19. }
本文导读目录