ReactNative await和async

async

async字面理解是异步,如果要真正理解async,需要明白promise的概念。promise类似一个承诺,比如小王对老王承诺周三之前把需求搞定,有了这个承诺,这个承诺有两种可能,所以老王就制订了两个方案:

 1. 小王没搞定,即reject,那么老王就再给一天时间。
 2. 小王搞定了,即resolve,那么交给测试进行测试。
 3. 以防万一,老王多留了个心眼,那就是这个老板临时决定暂停这个项目,即catch(error)。

其实从技术层面上说,这些就是一个异步函数注册回调,只是这种方式更简单直观。

async在RN中,来标识函数为异步函数,即函数实现中有耗时操作。async函数会返回一个promise,有了promise,当然就可以为所欲为了。即:then(()=>{}) ,一般常见用法会与await共用。

await

await必须在async修饰的函数中使用,标识修饰语句存在耗时操作,当线程执行到await所在行时,类似jav等待异步返回。等待的过程会一直阻塞在await所在行,直到拿到返回值。

  • 举例
_sleep(second) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('sleep end');
        }, second);
    })
}

async _test() {
     console.log('sleep start ');
     var startTime = new Date().getTime()
     let result = await this.sleep(2000);
     console.log(result+",cost:"+(new Date().getTime()-startTime));
}

_test();

输出结果:

12-13 18:46:40.985  9606 15688 I ReactNativeJS: sleep start
12-13 18:46:42.996  9606 15688 I ReactNativeJS: sleep end,cost:2010

多的10ms应该是执行其他语句产生的。

  • 举例

ReactNative await和async_第1张图片

ReactNative await和async_第2张图片

storageService是对AsyncStorage的封装,AsyncStorage细节可以去看,有点像android sp,代码执行到setItem行时,会同步挂起,直到异步setItem成功返回才会执行下面代码。getItem同理。那么会有疑问了,如何判断await有等待异步操作结束呢?单凭日志中的时间差有点难说明。所以就有了下面的对比。

setItem加await,使其同步等待,而tmp2去掉getItem取值,直接赋值位tmp,观察日志发现,执行命令并没有时间差。
ReactNative await和async_第3张图片

ReactNative await和async_第4张图片

你可能感兴趣的:(RN)