zoukankan      html  css  js  c++  java
  • 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/
  • 相关阅读:
    C++实现希尔排序和快排
    操作系统重点知识汇总
    结构体(对齐规则及举例)
    指针和引用(传指针和传引用)
    数组和指针
    判断一个字符是否为数字的两种方法(C/C++)
    浅谈操作系统栈和堆(区别与联系)
    浅谈malloc/free和new/delete 的区别
    操作符和表达式
    windows重装系统后grub引导菜单修复方法(亲自实验过)
  • 原文地址:https://www.cnblogs.com/moonpanda/p/4645482.html
Copyright © 2011-2022 走看看