apicloud apicloud

注册
查看: 6015|回复: 13

[APP开发技巧] 异步模式中的同步(一) 一组异步操作的同步

业余车手

UID:22414

主题:
8
帖子:
815
云币:
12667

版主勋章APICloud粉丝

[APP开发技巧] 异步模式中的同步(一) 一组异步操作的同步

6015 13 | 发表于 2015-11-3 21:52:48 |阅读模式 | |
本帖最后由 yyyfx 于 2015-11-3 21:51 编辑

APICloud 中的大多数 API 都是异步的。有时候,我们需要在一组异步操作之后,进行一次同步的操作。有什么方便易用的方法可以实现这一点呢?
我们可以借助于 Async.js 的 async.series 或者 async.parallel 达到这一目的。

async.series(tasks, [callback])
series 按照顺序依次执行 tasks 数组中的操作(上一个执行完成才执行下一个)。如果遇到错误,则直接中断执行,并将错误返回到 callback 中。当最后一个操作执行成功,则将 results 数组返回给 callback。
  1.     async.series([
  2.         function(){ ... },
  3.         function(){ ... }
  4.     ], callback);
复制代码

async.parallel(tasks, [callback])
parallel 并行执行 tasks 数组中的操作。如果遇到错误,则直接中断执行,并将错误返回到 callback 中。如果所有的 tasks 执行成功,则将 results 数组返回给 callback。
  1.     async.parallel([
  2.         function(){ ... },
  3.         function(){ ... }
  4.     ], callback);
复制代码
这两者的区别在于 tasks 数组中的异步操作是串行还是并行。

下面我们基于 async.parallel 以及 APICloud 中的 api.getPrefs,来完成一个读取多个偏好设置的例子。
  1.         // 将需要获取的参数放在 keys 数组中
  2.         var keys = ['a', 'b', 'c', 'd'];

  3.         // 使用 api.setPrefs 设置各参数
  4.         for (var i = 0; i < keys.length; i++) {
  5.             api.setPrefs({
  6.               key: keys[i],
  7.               value: 'key-' + keys[i]
  8.             });
  9.         }

  10.         // 获取多个 key 的值
  11.         getKeys(keys, function(ret, err) {
  12.             // 包含所有取得的 key值,按照顺序排列
  13.             // 这里得到的是 ['key-a', 'key-b', 'key-c', 'key-d']
  14.             if (ret) {
  15.                 alert(typeof ret);
  16.                 alert(ret.length);
  17.                 alert(ret);
  18.             } else {
  19.                 alert(err);
  20.             }            
  21.         });

  22.         /**
  23.          * 获取多个参数
  24.          * @param  {Array}   keys      参数名称数组
  25.          * @param  {Function} callback 获取参数后的回调函数
  26.          * @return {void}
  27.          */
  28.         function getKeys(keys, callback) {
  29.             // 设置要取得 key的函数
  30.             var getPrefsFunctions = [];
  31.             for (var i = 0; i < keys.length; i++) {
  32.                 var fun = prefsFun(keys[i]);
  33.                 getPrefsFunctions.push(fun);
  34.             }

  35.             // 执行获取 keys 的操作
  36.             async.parallel(getPrefsFunctions,
  37.             function(err, results) {
  38.                 if (err) {
  39.                     callback && callback(null,err);            
  40.                 } else {
  41.                     callback && callback(results, err);
  42.                 }
  43.             });

  44.             /**
  45.              * 返回满足 async 格式的函数,该函数使用 api.getPrefs
  46.              * 获取指定的 key
  47.              * @param  {string} key key 名称
  48.              * @return {Function}  满足 async 格式的函数
  49.              */
  50.             function prefsFun(key) {
  51.                 return function(callback) {
  52.                     api.getPrefs({
  53.                         key: key
  54.                     }, function(ret, err){
  55.                           if (ret) {
  56.                               callback(null, ret.value);
  57.                           } else {
  58.                               callback(err);
  59.                           }
  60.                     });         
  61.                 };
  62.             }
  63.         }
复制代码

详细的用法请参考
[1] [async](https://github.com/caolan/async)
[2] [async 模块的异步处理](https://cnodejs.org/topic/53d3938d895ba3062b7f4509)
1

查看全部评分

驾校小白

UID:126745

主题:
0
帖子:
11
云币:
22
发表于 2015-11-6 14:25:15 |
谢谢,正需要异步转同步,异步太多真头疼!

主题:
9
帖子:
18
云币:
59
发表于 2015-12-4 16:44:02 |
太好了,简直爱死你了,狗日的三个函数一块执行可以去死了

新手上路

UID:112383

主题:
10
帖子:
82
云币:
257
发表于 2016-1-7 16:05:13 |
果断收藏了···找了蛮久的了

主题:
0
帖子:
5
云币:
275
发表于 2016-3-3 12:59:56 |
非常感谢 ,  终于解决了

主题:
34
帖子:
345
云币:
511

APICloud粉丝装逼侠

发表于 2016-3-15 16:49:26 |
真的看不懂,例子中没有用到 Async.js 啊,这个到底是怎么使用的?

业余车手

UID:22414

主题:
8
帖子:
815
云币:
12667

版主勋章APICloud粉丝

 楼主| 发表于 2016-3-15 19:17:47 |
奔跑de蜗牛 发表于 2016-3-15 16:49
真的看不懂,例子中没有用到 Async.js 啊,这个到底是怎么使用的?

在 getKeys 函数中有使用 async.parallel 哦。

这里以 APICloud 中的 api.getPrefs 为例,示范了用 Async.js 库中的
async.parallel 实现一组异步操作的同步操作。

理解这块的用法需要对 JavaScript 比较熟悉

驾校小白

UID:270928

主题:
2
帖子:
35
云币:
461

足球狗

发表于 2016-3-20 11:16:01 |
这个很有用,感谢分享

主题:
7
帖子:
40
云币:
63
发表于 2016-7-29 12:45:49 |
mark

驾校小白

UID:375468

主题:
9
帖子:
25
云币:
32
发表于 2017-5-12 01:34:42 |
哥们,有 Async.js么?共享一下呗
12下一页
您需要登录后才可以回帖 登录 | 立即注册

快速回复 返回顶部 返回列表