首页 > 其他分享 >js 异步发展过程

js 异步发展过程

时间:2024-03-21 17:55:58浏览次数:27  
标签:function 异步 return log js sayhello console 过程 op

yield
    return promoise
next参数
    next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值
next


01_callbackhell

let sayhello = function (name, callback) {
  setTimeout(function () {
    console.log(name);
    callback();
  }, 1000);
};
sayhello("first", function () {
  sayhello("second", function () {
    sayhello("third", function () {
      console.log("end");
    });
  });
});

02_promise.js

var sayhello = function (name) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      console.log(name);
      resolve();
    }, 1000);
  });
};
sayhello("first")
  .then(function () {
    return sayhello("second");
  })
  .then(function () {
    return sayhello("third");
  })
  .then(function () {
    console.log("end");
  })
  .catch(function (err) {
    console.log(err);
  });

03_generate.js

var sayhello = function (name) {
    return new Promise(function (resolve, reject) {
      setTimeout(function () {
        console.log(name);
        resolve();
      }, 1000);
    });
  };

function * genFun(){
    yield sayhello('first');
    yield sayhello('second');
    yield sayhello('third');
}


 
function co(g) {
    let nextObj = g.next();
    if (nextObj.done) {
      return true;
    } else {
      let v = nextObj.value;
      if (typeof v !== Promise) {
        v = Promise.resolve(v);
      }
      v.then((v) => co(g));
    }
  }

  co(genFun())

  04_await.js

  var sayhello = function (name) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      console.log(name);
      resolve();
    }, 1000);
  });
};

async function genFun() {
  await sayhello("first");
  await sayhello("second");
  await sayhello("third");
}

genFun();

05_co.js
/**
 * co function
 * Generator-based Control Flow
 */


function* gen(x) {
  console.log("start");
  yield new Promise((res, rej) => {
    setTimeout(() => {
      res("p1");
    }, 2000);
  });
  console.log("1");

  yield new Promise((res, rej) => {
    setTimeout(() => {
      res("p2");
    }, 1000);
  });
  console.log("2");
  return "end";
}


function co(g) {
  let nextObj = g.next();
  if (nextObj.done) {
    return true;
  } else {
    let v = nextObj.value;
    if (typeof v !== Promise) {
      v = Promise.resolve(v);
    }
    v.then((v) => co(g));
  }
}
var g = myGenerator();
co(g);

06_compile.js

function delay(ms) {
    return new Promise((res, rej) => {
        setTimeout(() => {
            res(true);
        }, ms);
    });
}

async function test(){
    console.log('start');
    await delay(1000)
    console.log('1');
    await delay(1000)
    console.log('2');
    await delay(1000)
    console.log('3');
    await delay(1000)
    console.log('end');
}
after compile

"use strict";
var __awaiter =
  (this && this.__awaiter) ||
  function (thisArg, _arguments, P, generator) {
    function adopt(value) {
      return value instanceof P
        ? value
        : new P(function (resolve) {
            resolve(value);
          });
    }
    return new (P || (P = Promise))(function (resolve, reject) {
      function fulfilled(value) {
        try {
          step(generator.next(value));
        } catch (e) {
          reject(e);
        }
      }
      function rejected(value) {
        try {
          step(generator["throw"](value));
        } catch (e) {
          reject(e);
        }
      }
      function step(result) {
        result.done
          ? resolve(result.value)
          : adopt(result.value).then(fulfilled, rejected);
      }
      let r=(generator = generator.apply(thisArg, _arguments || [])).next()
      step(r);
    });
  };
var __generator =
  (this && this.__generator) ||
  function (thisArg, body) {
    var _ = {
        label: 0,
        sent: function () {
          if (t[0] & 1) throw t[1];
          return t[1];
        },
        trys: [],
        ops: [],
      },
      f,
      y,
      t,
      g;
    return (
      (g = { next: verb(0), throw: verb(1), return: verb(2) }),
      typeof Symbol === "function" &&
        (g[Symbol.iterator] = function () {
          return this;
        }),
      g
    );
    function verb(n) {
      return function (v) {
        return step([n, v]);
      };
    }
    function step(op) {
      if (f) throw new TypeError("Generator is already executing.");
      while ((g && ((g = 0), op[0] && (_ = 0)), _))
        try {
          if (
            ((f = 1),
            y &&
              (t =
                op[0] & 2
                  ? y["return"]
                  : op[0]
                  ? y["throw"] || ((t = y["return"]) && t.call(y), 0)
                  : y.next) &&
              !(t = t.call(y, op[1])).done)
          )
            return t;
          if (((y = 0), t)) op = [op[0] & 2, t.value];
          switch (op[0]) {
            case 0:
            case 1:
              t = op;
              break;
            case 4:
              _.label++;
              return { value: op[1], done: false };
            case 5:
              _.label++;
              y = op[1];
              op = [0];
              continue;
            case 7:
              op = _.ops.pop();
              _.trys.pop();
              continue;
            default:
              if (
                !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) &&
                (op[0] === 6 || op[0] === 2)
              ) {
                _ = 0;
                continue;
              }
              if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
                _.label = op[1];
                break;
              }
              if (op[0] === 6 && _.label < t[1]) {
                _.label = t[1];
                t = op;
                break;
              }
              if (t && _.label < t[2]) {
                _.label = t[2];
                _.ops.push(op);
                break;
              }
              if (t[2]) _.ops.pop();
              _.trys.pop();
              continue;
          }
          op = body.call(thisArg, _);
        } catch (e) {
          op = [6, e];
          y = 0;
        } finally {
          f = t = 0;
        }
      if (op[0] & 5) throw op[1];
      return { value: op[0] ? op[1] : void 0, done: true };
    }
  };
function delay(ms) {
  return new Promise(function (res, rej) {
    setTimeout(function () {
      res(true);
    }, ms);
  });
}
function test() {
  return __awaiter(this, void 0, void 0, function () {
    return __generator(this, function (_a) {
      switch (_a.label) {
        case 0:
          console.log("start");
          return [4 /*yield*/, delay(1*1000)];
        case 1:
          _a.sent();
          console.log("1");
          return [4 /*yield*/, delay(1000)];
        case 2:
          _a.sent();
          console.log("2");
          return [4 /*yield*/, delay(1000)];
        case 3:
          _a.sent();
          console.log("3");
          return [4 /*yield*/, delay(1000)];
        case 4:
          _a.sent();
          console.log("end");
          return [2 /*return*/];
      }
    });
  });
}

test();

 

标签:function,异步,return,log,js,sayhello,console,过程,op
From: https://www.cnblogs.com/dming4/p/18087924

相关文章

  • js——Date()怎么将获取北京时间的日期,精确到时分秒
    JavaScript的Date对象可以获取本地时间,但不直接支持时区。要获取特定时区的时间,你需要进行时区转换。以下是一个函数,用于获取特定时区(如“Asia/Shanghai”,即北京时间)的当前日期和时间,精确到秒。functiongetBeijingTime(){constbeijing=newDate().toLocaleString('en......
  • 流域生态系统水-碳-氮耦合过程模拟
    原文链接:流域生态系统水-碳-氮耦合过程模拟https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247598401&idx=2&sn=4c972ff3a9046094042a0a3dc65e9764&chksm=fa8200a6cdf589b01b0af612a5810e6eda02cc9e7f5232db9157ff85de28626a8f4f1878fd9f&token=1444690340&la......
  • 插件-js实现动态时钟效果
    <divid="updatetime"></div>constupdateTime=()=>{varnow=newDate();varyear=now.getFullYear();varmonth=now.getMonth()+1;//getMonth()返回0-11varday=now.getDate();varhours=now.getHour......
  • vue3使用qrcodejs2-fix生成背景透明的二维码
    qrcodejs官方仓库:GitHub-davidshimjs/qrcodejs:Cross-browserQRCodegeneratorforjavascriptqrcodejs2-fix 是一个用于生成QR码的JavaScript库,使用的时候先安装,然后通过设置前景色和背景色可以控制显示的二维码效果。想生成透明背景的二维码也可以,我通过下面配置前景......
  • Dubbo23_软件架构的演进过程1
    软件架构的发展经历了由单体架构、垂直架构、SOA架构到微服务架构的演进过程,下面我们分别了解一下这几个架构。一、单体架构架构说明:全部功能集中在一个项目内(Allinone)。架构优点:​架构简单,前期开发成本低、开发周期短,适合小型项目。架构缺点:全部功能集成在一个......
  • nodejs 实现 AMD 加载 依赖
    importfsfrom"fs";importpathfrom"path";importvmfrom"vm";exportclassLoadComponent{componentsPath:string=path.resolve("../first/components/");componentName:string="";componentIn......
  • HTTPS的过程
       主要有发起请求、验证身份、协商秘钥、加密会话4大步骤    1)客户端向服务端发起建立HTTPS请求。   2)服务器向客户端发送数字证书。   3)客户端验证数字证书,证书验证通过后客户端生成会话密钥(双向验证则此处客户端也会向服务器发送证书)。   4)......
  • 重新记录一下ArcGisEngine安装的过程
    前言好久不用Arcgis,突然发现想用时,有点不会安装了,所以这里记录一下安装过程。下载Arcgis首先,下载一个arcgis版本,我这里下的是10.1。推荐【gis思维(公众号)】,【麻辣GIS(网站)】。当然了,这都是很旧很旧的版本了,基本上没有三维功能。一定要下载带注册机的。arcgis的压缩包包含3......
  • node.js学习:fs.writeFile方法和fs.appendFile方法
     前言初学者,想记录一下Node.js学习上的一些新知fs.writeFile方法语法:fs.writeFile(file,data,[options],callback)file:要写入数据的文件路径。data:要写入的数据,可以是字符串或者缓冲区。options(可选):一个对象,包含文件写入的选项。常见的选项包括编码方式和文......
  • js substr 根据字节长度截取字符串
    jssubstr根据字节长度截取字符串此方法应该还可以被优化一下/** *根据字节长度截取字符串 *@paramstr字符串 *@parambytesStart字节截取起始位置 *@parambytesLen字节截取长度 */substrByBytes(str,bytesStart,bytesLen){ letbytes=0//字节数 ......