NodeJs使用asyncAwait两法

2017-06-17 18:33:17

async/await使用同步的方式来书写异步代码,将异步调用的难度降低到接近于0,未来必将大放异彩。然而在当下,由于标准化的缓存步伐,async/await尚在ES7的草案中。为了尝先,特试用了下面两种方式:

  • 使用社区提供的asyncawait封装

  • 使用ES7草案

使用社区提供的asyncawait模块

Git地址

git@github.com:yortus/asyncawait.git

使用方法:

1.       安装node模块

a)         npm install asyncawait@1.0.3 –save

2.       创建示例类AsyncService.js

var async require('asyncawait/async');
var await require('asyncawait/await');
var sleep async(
    
function sleep(timeout) {
        
return new Promise(function (resolve, reject) {
            
setTimeout(function () {
                resolve();
            }, timeout);
        });
    }
);

(
async(
    
function () {
        
console.log('Do some thing, ' new Date());
        
await(sleep(3000));
        
console.log('Do other things, ' new Date());
    }
))();

3.       运行AsyncService.js

a)         node AsyncService.js

b)         运行结果:

Do some thing, Wed Jun 15 2016 11:09:05 GMT+0800 (中国标准时间)

Do other things, Wed Jun 15 2016 11:09:08 GMT+0800 (中国标准时间)

注意事项

1.       asyncawait模块内部引用bluebird模块.

2.       无须编译为Es5,可直接运行.

使用ES7草案

使用方法:

1.       安装node模块,需要的一系列模块如下:

a)    babel-cli
b)    babel-preset-es2015"
c)    babel-preset-react":
d)    babel-preset-stage-3
e)    babel-polyfill

2.       创建示例类 AsyncAwaitService.js

async function sleep(timeout) {
   
return new Promise((resolve, reject) => {
       
setTimeout(function () {
            resolve();
        }, timeout);
    });
}

(
async function () {
   
console.log('Do some thing, ' + new Date());
   
await sleep(3000);
   
console.log('Do other things, ' + new Date());
})();

                  

3.       编译AsyncAwaitService.js

a)         配置babel

                         i.              package.json中加入babel节点,内容如下:

 

"babel": {
 
"presets": [
   
"es2015",
   
"react",
   
"stage-3"
 
],
 
"plugins": []
}

          

b)         编译

babel AsyncAwaitService.js --out-file AsyncAwaitService_es5.js
或者
babel AsyncAwaitService.js -o AsyncAwaitService_es5.js

c)         标记编译后的代码

     在AsyncAwaitService_es5.js脚本头部加入以下代码:
require('babel-polyfill')

4.       运行AsyncAwaitService_es5.js

a)         node AsyncAwaitService_es5.js

b)         运行结果:

Do some thing, Wed Jun 15 2016 11:54:13 GMT+0800 (中国标准时间)

Do other things, Wed Jun 15 2016 11:54:16 GMT+0800 (中国标准时间)

注意事项

1.       async/await通过babel编译为Es5,方可直接运行.

2.       babel编译相关内容可参考阮一峰博客 http://www.ruanyifeng.com/blog/2016/01/babel.html


  • 2020-01-20 08:29:14

    js如何生成唯一标识符UUID

    在JavaScript中生成uuid的代码如下,这个函数会直接给你返回uuid,所以直接调用,然后用变量接收即可!

  • 2020-01-30 11:19:58

    Android中添加两个(多个)FileProvider节点问题

    我们知道在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile(..)来获取uri了,但是在写入数据的时候是可以通过Uri.fromFile(..)来获取uri的,android 官网给出的解决办法是通过FileProvider来解决这一问题,我们需要在AndroidManifest.xml 配制provider节点。

  • 2020-02-02 15:40:36

    Apache Commons IO之IOUtils优雅操作流

    在开发过程中,你肯定遇到过从流中解析数据,或者把数据写入流中,或者输入流转换为输出流,而且最后还要进行流的关闭,原始jdk自带的方法写起来太复杂,还要注意各种异常,如果你为此感到烦恼,那IOUtils可以让我们优雅的操作流。

  • 2020-02-02 19:24:38

    百度视频SDK,突然不能播放

    开发过程中,不知道什么时候开始视频不能播发了,怎么办都不行,其他项目没问题,线上都也没有问题,这可急躁完蛋我了,整了仨小时,还是那熊样。 哎。