如何理解线程中async/await,怎么使用

1、async/await肯定是异步的。重点在await上,而不在async上。
2、多线程是并发的一种形式,异步也是并发的一种形式。
3、async不一定要跟await一起使用(见下面示例)。但是最好是一起。它们返回Task<T>、Task,也可以void(不推荐)。

static async Task ThrowNotImplementedExceptionAsync()
        {
            throw new NotImplementedException();
        }

async/await是什么?

async/await其实是Promise的语法糖,它能实现的效果都能用then链来实现,这也和我们之前提到的一样,它是为优化then链而开发出来的。从字面上来看,async是“异步”的简写,await译为等待,所以我们很好理解async声明function是异步的,await等待某个操作完成。当然语法上强制规定await只能出现在asnyc函数中,我们先来看看async函数返回了什么: 

async function testAsy(){
   return 'hello world';
}
let result = testAsy(); 
console.log(result)

这个async声明的异步函数把return后面直接量通过Promise.resolve()返回Promise对象,所以如果这个最外层没有用await调用的话,是可以用原来then链的方式来调用的:
复制代码

async function testAsy(){
   return 'hello world'
}
let result = testAsy() 
console.log(result)
result.then(v=>{
    console.log(v)   //hello world
})

复制代码

联想一下Promise特点——异步无等待,所以当没有await语句执行async函数,它就会立即执行,返回一个Promise对象,非阻塞,与普通的Promise对象函数一致。

重点就在await,它等待什么呢?

按照语法说明,await等待的是一个Promise对象,或者是其他值(也就是说可以等待任何值),如果等待的是Promise对象,则返回Promise的处理结果;如果是其他值,则返回该值本身。并且await会暂停当前async function的执行,等待Promise的处理完成。若Promise正常处理(fulfillded),其将回调的resolve函数参数作为await表达式的值,继续小蜜蜂论坛回帖机执行async function;若Promise处理异常(rejected),await表达式会把Promise异常原因抛出;另外如果await操作符后面的表达式不是一个Promise对象,则返回该值本身。

发布了34 篇原创文章 · 获赞 0 · 访问量 1355

猜你喜欢

转载自blog.csdn.net/netyou/article/details/104339184
今日推荐