本文地址 http://www.cnblogs.com/jasonxuli/p/6047590.html

nodejs 7.0.0 已经支持使用 --harmony-async-await 选项来开启async 和 await功能。

在我看来,yield 和 async-await 都是在特定范围内实现了阻塞;从这方面来看,await 相当于在阻塞结合异步调用上前进了一步。

使用async前缀定义的function中可以使用await来等待Promise完成(promise.resolve() 或 promise.reject()), 原生Promise或者第三方Promise都可以。

"use strict";

console.log(process.version);

var Promise = require('bluebird');
var requestP = Promise.promisify(require('request')); async function testAsync(){
try{
return await requestP('http://www.baidu.com');
}catch(e){
console.log('error', e);
}
} var b = testAsync();
b.then(function(r){
console.log('then');
console.log(r.body);
}); console.log('done');

node.exe --harmony-async-await test.js

console结果:

v7.0.0
done
then
<!DOCTYPE html><!--STATUS OK-->
<html>
<head>

......

采用await,可以比较容易处理某些Promise必须结合循环的情况,比如:

async getStream(){

var result = '';

var chunk = await getChunk();

while (chunk.done == false){

result += chunck.data;

chunk = await getChunk();

}

}

比较起来,原生Promise看起来样子有些臃肿,而且无法显示错误信息的stack trace;倒是bluebird的promise的stack trace做的不错:

原生:

"use strict";

console.log(process.version);

Promise.resolve('aaa').then(function(){
throw new Error('error message');
}) console.log('done');

结果:

v7.0.0
(node:7460) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: error message
(node:7460) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
done

bluebird:

"use strict";

console.log(process.version);

var promise = require('bluebird');

promise.resolve('aaa').then(function(){
throw new Error('error message');
}) console.log('done');

结果:

v7.0.0
done
Unhandled rejection Error: error message
at f:\test\test2\test.js:49:11
at tryCatcher (F:\nodist\bin\node_modules\bluebird\js\release\util.js:16:23)
at Promise._settlePromiseFromHandler (F:\nodist\bin\node_modules\bluebird\js\release\promise.js:510:31)
at Promise._settlePromise (F:\nodist\bin\node_modules\bluebird\js\release\promise.js:567:18)
at Promise._settlePromiseCtx (F:\nodist\bin\node_modules\bluebird\js\release\promise.js:604:10)
at Async._drainQueue (F:\nodist\bin\node_modules\bluebird\js\release\async.js:143:12)
at Async._drainQueues (F:\nodist\bin\node_modules\bluebird\js\release\async.js:148:10)
at Immediate.Async.drainQueues (F:\nodist\bin\node_modules\bluebird\js\release\async.js:17:14)
at runCallback (timers.js:637:20)
at tryOnImmediate (timers.js:610:5)
at processImmediate [as _immediateCallback] (timers.js:582:5)

references:

https://blog.risingstack.com/async-await-node-js-7-nightly/

https://developers.google.com/web/fundamentals/getting-started/primers/async-functions

nodejs7.0 试用 async await的更多相关文章

  1. VS2010 + C#4.0使用 async + await

    方法一: 安装官方出的Microsoft.Bcl.Async包 最新发布日期为 2014/4/12,版本1.0.168 (不支持VS2010) 1.解决方案-右键-管理解决方案的NuGet程序包 2. ...

  2. [C#] .NET4.0中使用4.5中的 async/await 功能实现异

    好东西需要分享 原文出自:http://www.itnose.net/detail/6091186.html 在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framew ...

  3. 小心C# 5.0 中的await and async模式造成的死锁

    平时在使用C# 5.0中的await and async关键字的时候总是没注意,直到今天在调试一个ASP.NET项目时,发现在调用一个声明为async的方法后,程序老是莫名其妙的被卡住,就算声明为as ...

  4. [C#] .NET4.0中使用4.5中的 async/await 功能实现异步

    在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用.这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出去 ...

  5. .NET4.0中使用4.5中的 async/await 功能实现异步

    在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用.这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出去 ...

  6. C#Framework4.0支持异步async/await语法

    由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...

  7. Python的异步编程[0] -> 协程[0] -> 协程和 async / await

    协程 / Coroutine 目录 生产者消费者模型 从生成器到异步协程– async/await 协程是在一个线程执行过程中可以在一个子程序的预定或者随机位置中断,然后转而执行别的子程序,在适当的时 ...

  8. tornado5.0+async+await

    不使用数据库的情况下实现异步 使用gen.sleep()模拟阻塞 使用gen.sleep(time) 而不是time.sleep(),time.sleep()阻塞整个进程,看gen.sleep()源码 ...

  9. [转]小心C# 5.0 中的await and async模式造成的死锁

    原文链接 https://www.cnblogs.com/OpenCoder/p/4434574.html 内容 UI Example Consider the example below. A bu ...

随机推荐

  1. 让你的PHP程序真正的实现多线程(PHP多线程类)(转)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  2. Windows下codeblocks的安装与配置

    最近自己正好要使用codeblocks编写C++程序,安装好却发现无法编译,如果您也遇到相似问题,可以参考本文. 如果您已安装codeblocks,想转换成中文界面,直接参考Step 2. 如果您C程 ...

  3. btn控件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. jq实现竞拍倒计时

    1jq的效果代码 //全局变量用于存储当前时间 var nows; function rightZeroStr(v) { ) { " + v; } return v + "&quo ...

  5. Linux shell 脚本攻略之根据扩展名切分文件名

    摘自:<Linux shell 脚本攻略>Page61-62  

  6. Linux 学习笔记 文件权限

    * Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户.这些账户称作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户. 所有运行在后台的服务都需要用一个系统用户账户登 ...

  7. Android+Robotium

    因为调动到一个新的部门在这个部门做的一直就是移动产品,所以这段时间会一直不断的研究app的自动化,主要是针对android,这里我采用的是Robotium框架,这个框架比较简单,使用eclipse+r ...

  8. MYSQL基础笔记(一)

    关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...

  9. (转载)MatLab绘图

    转载自:http://www.cnblogs.com/hxsyl/archive/2012/10/10/2718380.html 转载自:http://www.cnblogs.com/jeromebl ...

  10. iOS之原生地图与高德地图

    原生地图 1.什么是LBS LBS: 基于位置的服务 Location Based Service 实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App 2.定位方式 1.GPS定位 2. ...