下面是 Promise+async+Generator 的实现原理的完整攻略:
Promise 的实现
-
Promise 内部维护了一个状态值,有三种状态:
pending
,fulfilled
和rejected
。 -
在 Promise 内部定义了
resolve
和reject
两种方法,用于设置异步操作成功和失败后的返回结果。 -
Promise 内部还定义了
then
方法,用于注册事件回调,当异步操作成功时触发onfulfilled
,当异步操作失败时触发onrejected
。
简单的 Promise 示例:
function myPromise(fn) {
let state = 'pending';
let value = null;
const callbacks = [];
this.then = function (onFulfilled, onRejected) {
return new myPromise((resolve, reject) => {
handle({ onFulfilled, onRejected, resolve, reject });
});
};
function handle(callback) {
if (state === 'pending') {
callbacks.push(callback);
return;
}
const cb =
state === 'fulfilled' ? callback.onFulfilled : callback.onRejected;
const next = state === 'fulfilled' ? callback.resolve : callback.reject;
if (!cb) {
next(value);
return;
}
let ret;
try {
ret = cb(value);
} catch (e) {
callback.reject(e);
return;
}
callback.resolve(ret);
}
function resolve(newValue) {
if (newValue && typeof newValue.then === 'function') {
newValue.then(resolve, reject);
return;
}
state = 'fulfilled';
value = newValue;
setTimeout(() => {
callbacks.forEach((callback) => handle(callback));
}, 0);
}
function reject(error) {
state = 'rejected';
value = error;
setTimeout(() => {
callbacks.forEach((callback) => handle(callback));
}, 0);
}
fn(resolve, reject);
}
// 调用示例
const p = new myPromise((resolve, reject) => {
setTimeout(() => {
resolve('hello');
}, 2000);
});
p.then((result) => {
console.log(result); // hello
});
Generator 的实现
-
Generator 的核心就是用
yield
暂停和恢复函数的执行,并且通过next()
方法来控制函数的执行流程。 -
Generator 函数返回一个可迭代的 Generator 对象,该对象包含一个
next()
方法,在每次调用该方法时会返回一个包含两个属性的对象:value
和done
。
简单的 Generator 示例:
function* myGenerator() {
yield 'hello';
yield 'world';
return 'end';
}
const gen = myGenerator();
console.log(gen.next().value); // hello
console.log(gen.next().value); // world
console.log(gen.next().value); // end
async 的实现
-
async 就是 Generator 的语法糖,用于简化异步编程的复杂度。
-
async 函数返回一个 Promise 对象,该对象在正常执行结束后会返回最终结果,如果出现错误则会抛出异常。
-
async 函数中可以使用
await
关键字暂停函数执行,等待异步操作完成后继续执行,并且await
后面的表达式必须返回 Promise 对象。
简单的 async 示例:
const fetch = require('node-fetch');
async function myAsync() {
try {
const res = await fetch('https://jsonplaceholder.typicode.com/users/1');
const data = await res.json();
console.log(data.name);
} catch (e) {
console.error(e);
}
}
myAsync();
Promise + async + Generator 的实现
-
async 函数内部可以使用 Generator 函数执行异步操作,Generator 函数每遇到一个
yield
都会暂停执行并返回一个 Promise 对象,可以使用next()
方法继续执行 Generator 函数。 -
async 函数中使用的
await
关键字就是对 Generator 函数的语法封装,使其不需要手动调用next()
方法,等待异步操作完成后继续执行。
简单的 Promise+async+Generator 示例:
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
function* myGenerator() {
yield delay(2000);
yield delay(1000);
return 'end';
}
async function myAsync() {
const gen = myGenerator();
console.log('start');
await gen.next().value;
console.log('2s later');
await gen.next().value;
console.log('1s later');
console.log(await gen.next().value);
}
myAsync();
以上就是 Promise+async+Generator 的实现原理的完整攻略,希望对你有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Promise+async+Generator的实现原理 - Python技术站