• async await原理


    async await原理

    async await
    用 babel 编译成 es5 的版本

    async function test() {
    	await new Promise((res) => {
    		setTimeout(res, 1000);
    	});
    	await test();
    }
    

    首先思考,当我执行 test 后会如何?
    所有函数都会一干到底。所以为了在每个 await 停下来,必须要把 test 函数拆分成多个函数:

    function test(){
    
    }
    function test_p1(){
    	return new Promise(res=>{
            setTimeout(res,1000)
        })
    }
    function test_p2(){
        test()
    }
    

    test 应该做什么?
    test 应该返回一个 promise 表示是否执行完毕。

    function test() {
    	return new Promise(function (res) {
    		res();
    	});
    }
    

    紧接着,promise 的状态控制回调 res 何时调用?
    答案是 test_p1 test_p2 状态都发生变更后调用。

    所以我们需要监控 test_p1 test_p2 状态。
    因为有多个 promise 所以我们需要用一个栈结构来存所有的 promise。
    我们统一管理这个栈结构,而整个结构的状态就是 我们要监控的。

    /* 统一管理promise,同步转异步 */
    function execute(p_list) {
    	p_list[0].then(function () {
    		execute(p_list.slice(1));
    	});
    }
    

    我们可以把 res 塞给 execute,在 test 中启动 execute。最终:

    function execute(p_list, res) {
    	if (p_list.length === 0) {
    		/* 所有的await语句(拆解后的异步函数)执行完毕 */
    		return res();
    	}
    	p_list[0].then(function () {
    		execute(p_list.slice(1));
    	});
    }
    
    function test_p1(){
    	return new Promise(res=>{
            setTimeout(res,1000)
        })
    }
    function test_p2(){
        test()
    }
    function test() {
    	return new Promise(function (res) {
    		execute([test_p1, test_p2], res);
    	});
    }
    

    参考

    1. bable
  • 相关阅读:
    JavaScript的语法、数据类型、基本算数和逻辑运算操作
    ES6之常用开发知识点:入门(一)
    ES6中map数据结构
    VUE路径问题

    JS简易计算器的实现,以及代码的优化
    格雷编码
    H5网页布局+css代码美化
    jQuery---五角星评分案例
    Ajax工作原理及优缺点
  • 原文地址:https://www.cnblogs.com/AFu-1993/p/12809951.html
Copyright © 2020-2023  润新知