node 异步回调解决方法之yield

先看如何使用

使用的npm包为genny,npm 安装genny,使用 node -harmony 文件(-harmony 为使用es6属性启动参数) 启动项目

var genny= require(‘genny‘);
genny.run(function* (resume) {
    console.log("Hello");
    yield setTimeout(resume(), 1000);
    console.log("World");
});

输出Hello 暂停1秒,输出World,js的异步在yield 变成了类似同步的表现

var genny= require(‘genny‘);
var fs= require(‘fs‘);

genny.run(function* (resume) {
  var test= yield fs.readFile("test.js", resume());
  var test1= yield fs.readFile("test1.js", resume());
  var date="test文件信息为:"+test
  date+="test1文件信息为:"+test1
  console.log(date);
  var data = fs.writeFile("log.js",date);
}, function(err,ret) {
  // 这里若读取失败返回err信息
  //ret为异步回调返回结果
  if (err)
    console.error("Error reading file", err);
});

以上就是一个比较有代表性的例子通过有yield 实现代码上的‘伪同步‘,通过io读取信息,进行处理后,通过异步的方式储存下来,而且没有重重括号回调,代码也很好理解,是不是很给力。

相关原理

下面我在介绍genny这个包使用的相关特性,让大家对这种同步方式有一定的了解

1.ES6新特性 Generator

yield 实际上是javascript ES6新特性中的GeneratorFunction一个关键字

yield——迭代器生成器 
相关解释:

用于马上退出代码块并保留现场,当执行迭代器的next函数时,则能从退出点恢复现场并继续执行下去。下面有2点需要注意:

1. yield后面的表达式将作为迭代器next函数的返回值;

2. 迭代器next函数的入参将作为yield的返回值(有点像运算符)。

迭代器(Generator) 迭代器是一个拥有 {value:{}, done:{Boolean}} next([])方法 和 {undefined} throw([*])方法 的对象,

具体迭代器原理可以参照 www.cnblogs.com/fsjohnhuang/p/4166267.html 1-5的内容对迭代器的原理有很详细的讲解。

还有这篇 blog.zhaojie.me/2010/01/decompile-methods-with-yield-manually.html

2.promise规范

promise是对异步编程的一种抽象。它是一个代理对象,代表一个必须进行异步处理的函数返回的值或抛出的异常。 – Kris Kowal on JSJ

promise可以理解为一种规范,回调函数必须按function (err, data) {}此种格式,现在node的大部分异步库均遵守此规范。 
综上在上面的示例2里我们使用resume去当回调函数,也是使用了这个规范。

个人博客:http://www.yixiong.xyz/
时间: 2024-11-05 09:45:53

node 异步回调解决方法之yield的相关文章

Mac 无法运行node命令的解决方法

在安装node时提示:node-7.2.1 already installed, it's just not linked 导致无法运行node命令 按照特定的顺序执行这个命令列表: sudo brew uninstall node brew update brew upgrade brew cleanup brew install node sudo chown -R $(whoami) /usr/local brew link --overwrite node brew postinstal

javascript 多个异步处理解决方法

JS异步处理真是一个让人头疼的东西,尤其是AJAX这个玩意.刚开始为了方便我会将jquery ajax 这个属性这样设置 async: false但是这样做问题很多,会让浏览器假死,好在ajax提供了一个defferd的新办法. function makeJsonp(url, data) { return $.ajax({ type: "POST", data: data, url: url, dataType: "jsonp", jsonp: "call

python第三十七天,GIL全局解释器锁*****,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe

Nodejs异步回调的优雅处理方法

这篇文章主要介绍了Nodejs异步回调的优雅处理方法,本文使用了ES6中的新特性,用一种十分优雅的方式解决了回调问题,需要的朋友可以参考下 前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操 作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数: 复制代码 代码如下: fs.readFile('/etc/passwd', fun

jquery.Deferred promise解决异步回调

我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越深,代码可读性就会越差. $.ajax({ url: url, data: dataObject, success: function(){ console.log("I depend on ajax result."); }, error: function(){} }); consol

深入理解yield(三):yield与基于Tornado的异步回调

转自:http://beginman.cn/python/2015/04/06/yield-via-Tornado/ 作者:BeginMan 版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接. 发表于 2015-04-06 在深入理解yield(二):yield与协程 和深入理解yield(一):yield原理已经对yield原理及在python中的运用了解了很多,那么接下来就要结合Tornado,进行python异步的分析. 一.异步的实

Physics 碰撞检测回调方法出错或者没有效果解决方法

1.碰撞检测回调方法编译出错; auto *listener = EventListenerPhysicsContact::create(); listener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin,this); 在3.0rc版本中回调函数的参数变为一个,不能使用原来的两个参数; bool HelloWorld::onContactBegin(PhysicsContact& contact) { auto spr

node app.js不起作用的解决方法

In Express 3.0, you normally would use app.configure() (or app.use() ) to set up the required middleware you need. Those middleware you specified are bundled together with Express 3.0. e.g. var express = require('express'); var routes = require('./ro

Win7,Win8安装ArcGIS软件或Node.js等安装包出现2503错误的解决方法

最近win8系统在安装Node.js和ArcGIS软件的时候都出现了2503错误,后来才发现,都是Win8的权限系统在作怪.解决方法看似也挺原始,但很奏效: 1)进入C:\windows\installer路径,找到安装程序的msi.如果你的安装包没有把msi文件解压到这个路径下,请将对应的msi和CAB文件复制到这个路径下,比如ArcGIS的安装程序. 2)以管理员身份打开cmd程序 3)在命令行中输入"C:\windows\installer\xxx.msi"并回车.由下面的截图能