From 89a70418d7acc11c6c225190693c4235bcf47448 Mon Sep 17 00:00:00 2001 From: tedjmzhang Date: Tue, 11 Jun 2024 16:43:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0yeild=E5=92=8Cjson-scheme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 39 +++++++++++++++++++ package.json | 1 + src/frontend/javascript/js/generator.js | 15 +++++++ src/frontend/javascript/js/yeild.js | 21 ++++++++++ src/frontend/javascript/yeild.md | 27 +++++++++++++ src/frontend/json-scheme/index.js | 26 +++++++++++++ src/frontend/json-scheme/index.md | 24 ++++++++++++ src/frontend/library/typescript/decorator.ts | 25 ++++++++++++ .../typescript}/tsconfig.json | 3 +- tsconfig.json | 3 +- 10 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 src/frontend/javascript/js/generator.js create mode 100644 src/frontend/javascript/js/yeild.js create mode 100644 src/frontend/javascript/yeild.md create mode 100644 src/frontend/json-scheme/index.js create mode 100644 src/frontend/json-scheme/index.md create mode 100644 src/frontend/library/typescript/decorator.ts rename src/frontend/{vscode/debug => library/typescript}/tsconfig.json (62%) diff --git a/package-lock.json b/package-lock.json index bb798a2..dec2316 100644 --- a/package-lock.json +++ b/package-lock.json @@ -892,6 +892,17 @@ "vue-demi": ">=0.14.7" } }, + "ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "requires": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + } + }, "algoliasearch": { "version": "4.23.3", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", @@ -1277,6 +1288,11 @@ "tmp": "^0.0.33" } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, "fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -1750,6 +1766,11 @@ } } }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -2261,6 +2282,11 @@ "asap": "~2.0.3" } }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, "punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -2322,6 +2348,11 @@ "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, "require-one": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-one/-/require-one-1.0.3.tgz", @@ -2638,6 +2669,14 @@ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==" }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 01887a7..69528a0 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@metalsmith/layouts": "^2.7.0", "@metalsmith/markdown": "^1.10.0", "@metalsmith/permalinks": "^3.0.1", + "ajv": "^8.16.0", "chalk": "^5.3.0", "commander": "^12.1.0", "gogocode": "^1.0.55", diff --git a/src/frontend/javascript/js/generator.js b/src/frontend/javascript/js/generator.js new file mode 100644 index 0000000..009343b --- /dev/null +++ b/src/frontend/javascript/js/generator.js @@ -0,0 +1,15 @@ +function getValue() { + let values = [] + let value1 = fetch('http://baidu.com').then(res => { + values.push(res) + yield res; + }) + .then(res => { + console.log('res', res); + }) + .catch(err2 => { + console.log('err2', err2) + }) +} + +getValue() \ No newline at end of file diff --git a/src/frontend/javascript/js/yeild.js b/src/frontend/javascript/js/yeild.js new file mode 100644 index 0000000..60f7e33 --- /dev/null +++ b/src/frontend/javascript/js/yeild.js @@ -0,0 +1,21 @@ +let outValue = 0, outStep = 0; +function* counter(value) { + let step; + + while (true) { + outStep = step = yield value++; + outValue = value + if (step) { + value += step; + } + } +} + +const generatorFunc = counter(0); +console.log(generatorFunc.next().value); // 0 +console.log(generatorFunc.next().value); // 1 +console.log(generatorFunc.next().value); // 2 +console.log(generatorFunc.next().value); // 3 +console.log(generatorFunc.next(10).value); // 14 +console.log(generatorFunc.next().value); // 15 +console.log(generatorFunc.next(10).value); // 26 \ No newline at end of file diff --git a/src/frontend/javascript/yeild.md b/src/frontend/javascript/yeild.md new file mode 100644 index 0000000..520295b --- /dev/null +++ b/src/frontend/javascript/yeild.md @@ -0,0 +1,27 @@ +# yeild + +就是程序执行到yeild的时候,会执行yeild后面跟着的表达式,然后立即返回值{value: 表达式值, done: true | false}。 +等到下次再调用next(param)时,param将会作为`yeild 表达式`的返回值,可以通过`variable = yeild 表达式`获取param值,然后继续往下执行; +直接调用next(), `yeild 表达式`的返回值为undefined; + +``` javascript +function* counter(value) { + let step; + + while (true) { + step = yield value++; // 每次都执行yeild后面的value++之后停止,下次调用next(param)的时候通过step获取param值。然后往下执行,碰到yeild又会暂停,没碰到yeild则done为true + if (step) { + value += step; + } + } +} + +const generatorFunc = counter(0); // 这里并没有调用函数 +console.log(generatorFunc.next().value); // 0 // 这里调用next之后才开始调用函数 +console.log(generatorFunc.next().value); // 1 +console.log(generatorFunc.next().value); // 2 +console.log(generatorFunc.next().value); // 3 +console.log(generatorFunc.next(10).value); // 14 +console.log(generatorFunc.next().value); // 15 +console.log(generatorFunc.next(10).value); // 26 +``` \ No newline at end of file diff --git a/src/frontend/json-scheme/index.js b/src/frontend/json-scheme/index.js new file mode 100644 index 0000000..dda0a3d --- /dev/null +++ b/src/frontend/json-scheme/index.js @@ -0,0 +1,26 @@ +// Node.js require: +const Ajv = require("ajv") + +const ajv = new Ajv() // options can be passed, e.g. {allErrors: true} + +const schema = { + // $schema: "https://json-schema.org/draft/2020-12/schema", + type: "object", + properties: { + foo: {type: "integer", "$comment": "Created by John Doe"}, + bar: {type: "string"}, + date1: {type: "string", pattern: "\\d*-\\d*-\\d*"} + }, + required: ["foo"], + additionalProperties: false, +} + +const data = { + foo: 1, + bar: "abc", + date1: "2019-12-12" +} + +const validate = ajv.compile(schema) +const valid = validate(data) +if (!valid) console.log(validate.errors) \ No newline at end of file diff --git a/src/frontend/json-scheme/index.md b/src/frontend/json-scheme/index.md new file mode 100644 index 0000000..268016d --- /dev/null +++ b/src/frontend/json-scheme/index.md @@ -0,0 +1,24 @@ +# json-scheme json语义化语法 +[官方介绍文档链接](https://json-schema.org/learn/getting-started-step-by-step) + +[实现库](https://json-schema.org/implementations#validators-javascript)有很多,比如ajv + +## 总结 +1. 必须在type定义类型,以下为所有可用类型 +string +number +integer +object +array +boolean +null + +2. 对于每一类型,都有对应的扩展属性。 +比如{type: "string"},可以加上pattern或者format或者minLength来额外定义string。 +{type: "number"},可以加Multiples来定义基础倍数 +{type: "object"},可以加properties定义属性,以及additionalProperties表示是否可冗余属性 + +3. 通用属性 +注释 $comment +枚举 "enum": ["red", "amber", "green"] +常量 "const": "United States of America" \ No newline at end of file diff --git a/src/frontend/library/typescript/decorator.ts b/src/frontend/library/typescript/decorator.ts new file mode 100644 index 0000000..7a7c243 --- /dev/null +++ b/src/frontend/library/typescript/decorator.ts @@ -0,0 +1,25 @@ +function first(a, b, c) { + console.log("first(): factory evaluated", a, b, c); + return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + console.log("first(): called"); + }; +} + +function second() { + console.log("second(): factory evaluated"); + return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + console.log("second(): called"); + }; +} + +function sealed(constructor: Function) { + Object.seal(constructor); + Object.seal(constructor.prototype); +} + +@sealed +class ExampleClass { + @first(1, 2,3) + @second() + methodFn1() {} +} \ No newline at end of file diff --git a/src/frontend/vscode/debug/tsconfig.json b/src/frontend/library/typescript/tsconfig.json similarity index 62% rename from src/frontend/vscode/debug/tsconfig.json rename to src/frontend/library/typescript/tsconfig.json index 28e1c0e..1676ab9 100644 --- a/src/frontend/vscode/debug/tsconfig.json +++ b/src/frontend/library/typescript/tsconfig.json @@ -3,6 +3,7 @@ "target": "ES5", "module": "CommonJS", "outDir": "out", - "sourceMap": true + "sourceMap": true, + "experimentalDecorators": true } } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 28e1c0e..1676ab9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,7 @@ "target": "ES5", "module": "CommonJS", "outDir": "out", - "sourceMap": true + "sourceMap": true, + "experimentalDecorators": true } } \ No newline at end of file