因为一些迭代原因,有可能会碰到要在同步任务中加入异步任务的情况。
这种时候如果本身代码是在一个async函数中,或者有Promise加持的情况下,会比较好改。
async function fn() {
syncTask();
syncTask();
// ...
await AsyncTask();
// ...
syncTask();
syncTask();
}
但是如果业务逻辑比较糅杂,一层一层比较深,又都是同步代码的时候,就比较麻烦。
这里有个概念方案,先记录一下,后续会验证。
核心是 HTTP + Service Worker
的能力。
在Worker中编写异步任务,然后利用Service Worker可以拦截请求。
在业务逻辑中通过 XMLHttpRequest
发起HTTP请求,被Service Worker拦截,拦截后执行异步任务。
这里的关键在于,XMLHttpRequest对象在发起请求时候要配置成同步的,这样就会等HTTP请求响应后,再执行后续逻辑,达到了“异步变同步”的效果。
const asyncTask = (taskId) => {
// 发起HTTP请求
};
class Comp extends PureComponent {
// ...
method = () => {
this.a();
// 同步的
asyncTask('task1');
this.b();
};
// ...
}