React Native 性能优化之可取消的异步操作
React Native 性能优化之可取消的异步操作本文出自《React Native 研究与实践》系列文章。 概述在项目开发中离不了的需要进行一些异步操作,这些异步操作在改善用户体验的同时也带来了一些性能隐患。 总而言之,异步操作在改善用户体验,增强系统灵活性的同时也带来了一些性能隐患,如果使用不当则会带来一些副作用。 那么如何在使用异步操作的同时规避它所带来的副作用呢? 问题不是出在异步操作上,异步操作本没有错,错在异步操作的不合理使用上。比如,页面已经关闭了,而页面的异步操作还在进行等使用问题。 为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();
上述方法,可以为异步操作添加可取消的功能,但是使用还是不够方便:在每个使用 “`javascript export default function makeCancelable(promise){ return { promise: wrappedPromise,cancel() { hasCanceled_ = true; },}; } 这样在使用的时候只需要将makeCancelable导入到你的相应js文件中就可以了。
```javascript
import makeCancelable from '../util/Cancelable'
<div class="se-preview-section-delimiter"></div>
可取消的网络请求fetch
this.cancelable = makeCancelable(fetch('url')));
this.cancelable.promise
.then((response)=>response.json()) .then((responseData)=> { console.log(responseData); }).catch((error)=> { console.log(error); }); <div class="se-preview-section-delimiter"></div>
取消网络请求:
在项目中的使用为了提高React Native应用的性能,我们需要在组件卸载的时候不仅要主动释放掉所持有的资源,也要取消所发出的一些异步请求操作。 componentWillUnmount() {
this.cancelable.cancel();
}
About本文出自[《React Native 研究与实践》栏目。 这里有你需要的干货:
推荐阅读
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |