博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React Native 性能优化之可取消的异步操作
阅读量:4084 次
发布时间:2019-05-25

本文共 2661 字,大约阅读时间需要 8 分钟。

本文出自系列文章。

概述

在项目开发中离不了的需要进行一些异步操作,这些异步操作在改善用户体验的同时也带来了一些性能隐患。 比如,在某页面进行异步操作,异步操作还没有完成时,该页面已经关闭,这时由于异步操作的存在,导致系统无法及时的回收资源,从而导致性能的降低,甚至出现oom。

总而言之,异步操作在改善用户体验,增强系统灵活性的同时也带来了一些性能隐患,如果使用不当则会带来一些副作用。

那么如何在使用异步操作的同时规避它所带来的副作用呢?

问题不是出在异步操作上,异步操作本没有错,错在异步操作的不合理使用上。比如,页面已经关闭了,而页面的异步操作还在进行等使用问题。 所以我们需要在编程中学会“舍得”,在适当的时候去取消一些异步操作。

为Promise插上可取消的翅膀

Promise是React Native开发过程中用于异步操作的最常用的API,但Promise没有提供用于取消异步操作的方法。为了实现可取消的异步操作,我们可以为Promise包裹一层可取消的外衣。

const makeCancelable = (promise) => {  let hasCanceled_ = false;  const wrappedPromise = new Promise((resolve, reject) => {    promise.then((val) =>      hasCanceled_ ? reject({isCanceled: true}) : resolve(val)    );    promise.catch((error) =>      hasCanceled_ ? reject({isCanceled: true}) : reject(error)    );  });  return {    promise: wrappedPromise,    cancel() {      hasCanceled_ = true;    },  };};

然后可以这样使用取消操作:

const somePromise = new Promise(r => setTimeout(r, 1000));//创建一个异步操作const cancelable = makeCancelable(somePromise);//为异步操作添加可取消的功能cancelable  .promise  .then(() => console.log('resolved'))  .catch(({isCanceled, ...error}) => console.log('isCanceled', isCanceled));// 取消异步操作cancelable.cancel();

上述方法,可以为异步操作添加可取消的功能,但是使用还是不够方便:在每个使用makeCancelable的页面都需要复制粘贴上述代码。
下面我们做一下改进,将上述代码抽离到一个文件中。

/*** Cancelable* GitHub:https://github.com/crazycodeboy* Eamil:crazycodeboy@gmail.com * @flow**/'use strict'export default function makeCancelable(promise){   let hasCanceled_ = false;   const wrappedPromise = new Promise((resolve, reject) => {       promise.then((val) =>           hasCanceled_ ? reject({isCanceled: true}) : resolve(val)       );       promise.catch((error) =>           hasCanceled_ ? reject({isCanceled: true}) : reject(error)       );   });   return {       promise: wrappedPromise,       cancel() {           hasCanceled_ = true;       },   };}

这样在使用的时候只需要将makeCancelable导入到你的相应js文件中就可以了。

import makeCancelable from '../util/Cancelable'

可取消的网络请求fetch

fetch是React Native开发过程中最常用的网络请求API,和Promis一样,fetch也没有提供用于取消已发出的网络请求的API。因为fetch返回的是一个Promise,所以我们可以借助上述方法,�来取消fetch所发出的网络请求。

this.cancelable = makeCancelable(fetch('url')));        this.cancelable.promise            .then((response)=>response.json())            .then((responseData)=> {                          console.log(responseData);                                        }).catch((error)=> {                console.log(error);             });

取消网络请求:

this.cancelable.cancel();

在项目中的使用

为了提高React Native应用的性能,我们需要在组件卸载的时候不仅要主动释放掉所持有的资源,也要取消所发出的一些异步请求操作。

componentWillUnmount() {        this.cancelable.cancel();}

About

本文出自[《栏目。

这里有你需要的干货:

:第一时间获取推送
:你需要的,才是干货
:我的开源项目

推荐阅读

  • :汇集了各类react-native学习资料、工具、组件、开源App、资源下载、以及相关新闻等。
  • :汇聚知识,分享精华。

转载地址:http://vkrni.baihongyu.com/

你可能感兴趣的文章
Winform多线程
查看>>
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
二叉树深度优先遍历和广度优先遍历
查看>>
生产者消费者模型,循环队列实现
查看>>
获得github工程中的一个文件夹的方法
查看>>
《PostgreSQL技术内幕:查询优化深度探索》养成记
查看>>
PostgreSQL查询优化器详解之逻辑优化篇
查看>>
STM32中assert_param的使用
查看>>
为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
查看>>
字符串的截取
查看>>
Tensorflow入门资料
查看>>
剑指_复杂链表的复制
查看>>
CentOS操作系统下安装yum的方法
查看>>
FTP 常见问题
查看>>
zookeeper单机集群安装
查看>>
do_generic_file_read()函数
查看>>
Python学习笔记之数据类型
查看>>
Python学习笔记之特点
查看>>