美文网首页日常刻书
异步任务执行

异步任务执行

作者: F_wind | 来源:发表于2021-01-30 10:38 被阅读0次

《深入理解ES6》阅读随笔

在使用 JavaScript 写程序的过程中,会遇到一些异步调用的情况,如果只是单层的异步调用,还比较好理解,但如果是多重循环嵌套,那么处理起来就会比较棘手。在 ES6 中,可以利用生成器的 yield 暂停功能,来处理一些异步任务。

简单的任务执行器

run1 定义了一个简单的任务执行器,将需要异步执行的任务放在生成器中传给 run1,即可实现简单的异步执行功能:

// 简单的任务执行器
function run1(task) {
  let tasker = task(); // 实例化迭代器
  let result = tasker.next();
  function step() {
    if (!result.done) {
      console.log("setp:", result.value);
      result = tasker.next();
      step();
    }
  }
  step();
}
console.log("----- 简单的任务执行器 -----");
run1(function* () {
  yield 1;
  yield 2;
});

// 输出结果:
// ----- 简单的任务执行器 -----
// setp: 1
// setp: 2

向任务执行器传递参数

run2 跟 run1 类似,多了传参的功能:

// 向任务执行器传递参数
function run2(task) {
  let tasker = task();
  let result = tasker.next();
  function step() {
    if (!result.done) {
      console.log("setp:", result.value);
      result = tasker.next(result.value);
      step();
    }
  }

  step();
}

console.log("----- 向任务执行器传递参数 -----");
run2(function* () {
  let first = yield 1;
  yield first + 2;
});

// 输出结果:
// ----- 向任务执行器传递参数 -----
// setp: 1
// setp: 3

异步任务执行器

run3 比 run2 更进一步,将传递的参数换为函数,可以用于处理异步函数:

// 异步任务执行器
function run3(task) {
  let tasker = task();
  let result = tasker.next();
  function step() {
    if (!result.done) {
        // 判断参数是否为函数
      if (typeof result.value === "function") {
        result.value(function (err, data) {
          if (err) {
            result = tasker.throw(err);
            return;
          }
          result = tasker.next(data);
          step();
        });
      } else {
        result = tasker.next(result.value);
        step();
      }
    }
  }
  step();
}
console.log("----- 异步任务执行器 -----");
const fs = require("fs");
function readfile(filename) {
  return function (cb) {
    fs.readFile(filename, { encoding: "utf-8" }, cb);
  };
}
run3(function* () {
  console.log("before read");
  const content = yield readfile("test.txt");
  console.log("file data:", content);
  console.log("after read");
});

// 输出结果
// ----- 异步任务执行器 -----
// before read
// file data: Hello,runner!
// after read

相关文章

  • 【javaScript练习】2021-02-23

    javaScript 作用域,异步执行,requestAnimationFrame 微任务,宏任务,异步执行 Ar...

  • js执行顺序总结

    流程图 首先执行同步任务,异步任务会插入到异步队列中。同步任务执行完毕,查询是否有异步任务,回到主任务执行。 微任...

  • 深入浅出Javascript事件循环机制-上(转)

    浅薄概念 Javascript是单线程,执行任务时,分同步任务和异步任务,执行同步任务时放入栈中执行,执行异步任务...

  • 异步任务执行

    《深入理解ES6》阅读随笔 在使用 JavaScript 写程序的过程中,会遇到一些异步调用的情况,如果只是单层的...

  • NSQ 消息队列

    异步任务与消息队列 同步任务:一定要等任务执行完了,得到结果,才执行下一个任务。 异步任务:不用等任务执行完,直接...

  • GCD小总结

    单例模式 串行队列同步/异步执行任务 并发队列同步/异步执行任务 队列组 延时执行 barrier

  • c#-异步编程模型-代码示例

    异步编程,当有Task完成就执行 手动执行取消任务 超时取消任务 异步文件读写

  • nextTick、setImmediate、promise.re

    执行队列(同步) 任务队列(异步事件) 每当异步任务完成后会在任务队列中添加一个关联事件,待执行队列任务执行完成...

  • 02、NodeJS-基础

    一、异步编程 异步操作 Node大量采用异步操作,即任务不是马上执行,而是直接插入任务队列的尾部,等前面任务执行完...

  • 02、NodeJS-基础

    一、异步编程 异步操作 Node大量采用异步操作,即任务不是马上执行,而是直接插入任务队列的尾部,等前面任务执行完...

网友评论

    本文标题:异步任务执行

    本文链接:https://www.haomeiwen.com/subject/eevhtltx.html