代码之家  ›  专栏  ›  技术社区  ›  B M

为什么可以尝试捕获异步等待调用?

  •  4
  • B M  · 技术社区  · 7 年前

    function handleDataClb(err, data) {
        if(!data) throw new Error('no data found');
        // handle data... 
    } 
    
    function f() {
        try {
            fs.readFile('data', 'utf8', handleDataClb);
        } catch(e) {
            // handle error... 
        }
    }
    

    这是一种尝试 f 不会捕捉 handleDataClb 因为回调是在稍后的阶段和上下文中调用的,其中try-catch不再可见。

    // coroutine example 
    co(function* doTask() {
        try {
            const res1 = yield asyncTask1(); // returns promise
            const res2 = yield asyncTask2(); // returns promise
            return res1 + res2;
        } catch(e) {
            // handle error... 
        }
    });
    
    // async-await example
    async function doTask() {
        try {
            const res1 = await asyncTask1(); // returns promise
            const res2 = await asyncTask2(); // returns promise
            return res1 + res2;
        } catch(e) {
            // handle error... 
        }
    }
    

    为什么和如何 catch 工作?合作项目如何 async 当其中一个 asyncTask 打电话会导致拒绝承诺?

    编辑:正如其他人所指出的,JavaScript引擎实现 await 运算符可以与Babel之类的transpilers使用的纯JavaScript实现非常不同,如上图所示 coroutine example

    2 回复  |  直到 7 年前
        1
  •  2
  •   Bergi    7 年前

    catch 工作?协同程序aka async如何在try catch中抛出错误?

    yield await 表达可以有3种不同的结果:

    • 它可以像一个 throw
    • return 声明,仅导致 finally 结束函数前要计算的语句

    对于挂起的生成器,可以通过调用 .next() , .throw() .return()

    当一个asyncTask调用导致拒绝承诺时?

    这个 等待 Promise.resolve() 我答应了,然后 .then() method

    calls gen.throw from the promise rejection callback .

        2
  •  1
  •   traktor    7 年前

    async 功能

    异步函数返回由函数体返回的值解析的承诺,或由函数体中抛出的错误拒绝的承诺。

    await

    引发的错误 等待 异步 函数,而不是允许它们向上传播执行堆栈并拒绝通过调用 异步

    等待

    try/catch 块设置在 函数的执行上下文不会仅仅因为被保存和恢复而被更改或变得无效 等待

    异步等待是使用生成器、承诺和协程实现的

    可能是巴别塔的一部分 异步 等待


    发电机功能

    生成器函数的执行上下文存储在其关联生成器对象的内部[[generator context]]槽中( ECMA 2015 25.3.2 )

    25.3.3.5 of ES6/ECMAScript 2015 )

    因此,当 yield 表达式返回。

    由于正常原因在生成器函数中抛出错误(语法错误、 throw

    以…的方式抛出错误 Generator.prototype.throw() 在生成器函数中引发一个错误,源于 yield expression try-catch using throw() , ECMA 2015 25.3.3.4

    摘要

    产量 用于 透明代码的工作原理与它们的工作原理相同 等待 本机中的运算符 异步