Node.js 7.0安装体验和示例代码解读
发布于 3 个月前 作者 i5ting 1747 次浏览 来自 分享

Node.js 7.0安装体验和示例代码解读

菜神 @fundon 大晚上不睡觉,放毒:https://github.com/pauliusuza/node-v7-async-await-demo?utm_content=buffer9bce9&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer 稍加整理,以便阅读

安装Node.js v7

很早之前https://nodejs.org/download/test就放出了构建好的测试版本的,我们可以使用nvm来安装。如果大家不熟悉nvm,可以参靠比较经典的Node.js的3m安装法

第一步配置环境变量,指定nvm使用的v7 mirror,这是因为默认的nvm mirror指向的是https://nodejs.org/dist/,所以默认nvm ls-remote是查不到v7的。

在terminal中执行,放在永久环境变量中不太必要

$ NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/test

然后查看一下远端版本

$ nvm ls-remote
         v4.6.1
         v6.7.0
         v7.0.0

然后就开始Node v7吧

$ nvm install 7
$ nvm use 7

我在安装的时候没有成功,后来是https://nodejs.org/download/test/v7.0.0-test201610107f7d1d385d/下载的源文件安装的。

如果上面的不可用,可以参考评论中的https://cnodejs.org/topic/580027e20bab808265185db2#58004364fdf3bd3d651185f4

示例代码解读

定义class

// An example class which generates a hello world greeting
class Demo {
  async greeting() {
    const h = await this.world();
    return h;
  }
  world() {
    return Promise.resolve('hello world');
  }
}

在promise时代,要做到每个流程函数都返回promise,然后再组装,这称为广义的promisify。现在换成async函数,主要是取决于await能组合的2种做法

  • 完全使用async函数
  • 使用返回promise的流程函数

本例中,就非常典型,在async函数greeting里通过await来执行this上下文中的world函数,很明显world是返回Promise的函数。

我之前也说过promise的重要性,几乎贯穿所有异步流程控制中。async/await时代的前期,它还是主力,无论是已有项目-知识迁移,还是组装和简化的便利性。

在Koa 2.x里使用

// Import Koa v2 dependency
const Koa = require('koa');

// Initialize Demo class instance
const demo = new Demo();

// Initialize Koa v2 instance
const app = new Koa();
const port = 3000;

// uses async arrow functions
app.use(async (ctx, next) => {
  try {
    await next(); // wait until we execute the next function down the chain, then continue;
  } catch (err) {
    ctx.body = { message: err.message };
    ctx.status = err.status || 500;
  }
});

// Set up a route
app.use(async ctx => {
  const retval = await demo.greeting();
  ctx.body = retval;
});

// Start listening on specified port
app.listen(port, function() {
  console.log("listening on port", port);
});

// Start the app with "node --harmony-async-await" flag, and go to http://localhost:3000

Koa 2.x的简单代码就不解释了,有疑问可以参见https://github.com/i5ting/stuq-koa

执行

$ node -v; node --harmony-async-await index.js

很明显,是通过–harmony-async-await这个flag来执行的。也就是说还没有变成内置功能。这让我们不禁想起当年generator的情况,从0.10,0.12····4.x。也就是说,变成内置还要很长时间

好在,我们已经能够体验了,老雷说:“这几个月js发展真快啊”,起来嗨~

26 回复

npm上有一个node-nightly模块,也可以用来尝试最新版本

NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/nightly/;这个可以安装成功 自豪地采用 CNodeJS ionic

@immatt2015 不行呀,你确定?

NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/nightly/; nvm ls-remote 能列出来就可以 列不出来要多执行几次。。。 自豪地采用 CNodeJS ionic

@immatt2015

NVM_NODEJS_ORG_MIRROR=https://nodejs.org/download/nightly/
nvm install v7.0.0-nightly20161013e4ee09a5b3 

这样是可以的

嗯嗯 自豪地采用 CNodeJS ionic

基数版本注定无法成为了LTS,要生产上用await和async还是得坐等nodejs8,但是那又至少是一年后的事了。另外async和await写入了语言标准没有?还是草案?

@youth7 chrome支持了,微软支持了,你觉得这货没前途么?

能不能不用显式的Promise,而全用async方式?

来自酷炫的 CNodeMD

哇哇哇,等了好久了,赶紧试一把

来自酷炫的 CNodeMD

@manxisuo async function 本质上就是Promise吧?

@youth7 async/await没赶上ES2016,只能等ES2017了,标准是迟早的事,但确实还要等上一段时间啊

@manxisuo 可以啊,但少了点组装的乐趣,另外没有promisefyall的红利

我只想知道es6的import/export啥时候加入node豪华午餐

@i5ting 为什么v8的人始终不弄这个呢?这不应该是ES6的标准吗,应该很高的优先级才对啊,想不通……

为什nvm ls-remote列出的都是iojs了,对node没有爱了?

多试一下就可以了 自豪地采用 CNodeJS ionic

@rwing 估计不可能的事,import是先加载,不能做动态加载,require可以动态加载,两个机制不一样

@i5ting

但是,像:

function sleep(secs) {
    return new Promise(resolve => {
        setTimeout(resolve, secs * 1000);
    });
}

这样的代码怎么办?如果不用Promise没法写吧?

promise是最基础的,除非能把以前的API都换了

搞不懂nodejs,async/await 本应该早就要当作重点来推进的,现在都node 7.0了,结果连async/await还没有默认开启,也真是醉了。

真爽 不用babel了

@arden 也可能是比较谨慎,目前v8 5.1到5.4,这几个版本怕是还不够好

回到顶部