(二)异步解决方案之callback
回调定义
就是一个函数里面使用 作为参数的函数。
Function1(Function2) {
Function2();
};
同步调用 - 老实说,这和我们 不将代码封装成 函数没有差别
也就是说 其实它 只是为了 将代码拆分。(也许是功能应该被拆,也许是代码太长)
const chooseHeroA = () => {
console.log('choose a');
}
const chooseHeroB = () => {
console.log('choose b');
}
chooseHeroA();
chooseHeroB();
同步调用
const chooseHeroA = (callback) => {
console.log('choose a');
callback && callback();
}
const chooseHeroB = () => {
console.log('choose b');
}
chooseHeroA(chooseHeroB);
异步调用 - 调用就是调用,但是 利用上了 异步的方法,那就叫异步调用了
比如 setTimeout 的异步实现方法
const chooseHeroA = (callback) => {
setTimeout(callback, 1000);
console.log('choose a');
}
const chooseHeroB = () => {
console.log('choose b');
}
chooseHeroA(chooseHeroB);
关于顺序: 这个顺序主要是表明。 虽然 a 在 b 代码之后,但是因为是异步的,所以并不会产生 前面的代码 阻塞 后面的代码的清空。
通过这样,它的功能显而意见,防止 超级麻烦的代码阻塞了代码的执行。
const chooseHeroA = (callback) => {
setTimeout(callback, 0);
console.log('choose a'); // a , b
}
const chooseHeroB = () => {
console.log('choose b');
}
chooseHeroA(chooseHeroB);
于是我们放一个什么叫超级麻烦的代码吧,比如说 无限的 for循环?还是不要无限了,给电脑放个假
const advantageAsync = (callback) => {
for (i = 0; i < 1000000000; i++) {};
console.log('choose a');
}
advantageAsync();
如果你的电脑很快就执行完了上面的代码,那说明你的电脑够好,它的数字还不够大
但是我的老人机已经露出了破绽。
于是,异步有了用武之地.
const advantageAsync = (callback) => {
setTimeout(() => {
for (i = 0; i < 1000000000; i++) {};
}, 0);
console.log('choose a');
}
advantageAsync();
回调,其实往往用在异步的使用上,是前端在 刀耕火种 时期的异步方式。
但是它的缺陷也很明显.
那么,游戏开始,来完成一个 小球动画吧(来自 慕课网 里的一个教程,改)
css
.ball{
width: 40px;
height: 40px;
border-radius: 20px;
}
.ball1{
background: red;
}
.ball2{
background: yellow;
}
.ball3{
background: blue;
}
html
<div class="ball ball1"></div>
<div class="ball ball2"></div>
<div class="ball ball3"></div>
js
const ball1 = document.querySelector(".ball1");
const ball2 = document.querySelector(".ball2");
const ball3 = document.querySelector(".ball3");
const getStyle = (ele, attr) => {
if (window.getComputedStyle) {
return window.getComputedStyle(ele, null)[attr];
} else {
return ele.currentStyle[attr];
}
};
const Move = (ball, target, next) => {
setTimeout(() => {
let marginLeft = parseInt(getStyle(ball, "marginLeft"));
if (marginLeft === target) {
next && next();
} else {
if (marginLeft < target) {
marginLeft ++;
} else {
marginLeft --;
}
ball.style.marginLeft = marginLeft + "px";
Move(ball, target, next);
}
}, 10);
};
Move(ball1, 100, function() {
Move(ball2, 200, function () {
Move(ball3, 300);
})
});
其实,我们只看 最后的 几行,我们就能够 明白,当操作一多,这是个什么情景。
其实 Promise,解决的就是这个缩进问题。
还是上面的 html 和 css,改的是 js部分的
const ball1 = document.querySelector(".ball1");
const ball2 = document.querySelector(".ball2");
const ball3 = document.querySelector(".ball3");
const getStyle = (ele, attr) => {
if (window.getComputedStyle) {
return window.getComputedStyle(ele, null)[attr];
} else {
return ele.currentStyle[attr];
}
};
const Promise = window.Promise;
const promiseAnimate = (ball, target) => {
return new Promise((resolve, reject) => {
const auto = (ball, target) => setTimeout(() => {
let marginLeft = parseInt(getStyle(ball, "marginLeft"));
if (marginLeft === target) {
resolve();
} else {
if (marginLeft < target) {
marginLeft ++;
} else {
marginLeft --;
}
ball.style.marginLeft = marginLeft + "px";
auto(ball, target);
}
}, 10);
auto(ball, target);
});
};
promiseAnimate(ball1, 100)
.then(() => {
return promiseAnimate(ball2, 200);
})
.then(() => {
return promiseAnimate(ball3, 300);
});
Promise的优点显而易见。
换了个写法?是的,就是如此。
没有嵌套就是可以为所欲为。
参考文献
(二)异步解决方案之callback的更多相关文章
- ES6学习笔记(十二)异步解决方案Promise
1.Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了P ...
- 异步解决方案----Promise与Await
前言 异步编程模式在前端开发过程中,显得越来越重要.从最开始的XHR到封装后的Ajax都在试图解决异步编程过程中的问题.随着ES6新标准的到来,处理异步数据流又有了新的方案.我们都知道,在传统的aja ...
- JS异步解决方案
前言 异步最早的解决方案是回调函数,如ajax,事件的回调,setInterval/setTimeout中的回调.但是回调函数有回调地狱的问题; 为了解决回调地狱的问题,社区提出了Promise解决方 ...
- CDC不同模式在ODI体现系列之二 异步模式
CDC不同模式在ODI体现系列之二 异步模式 2 异步模式需要在数据库中做一些准备工作: 改数据为归档并启用logminer: SQL> shutdown immediate 数据库已经关闭. ...
- js async await 终极异步解决方案
既然有了promise 为什么还要有async await ? 当然是promise 也不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. 回顾 Promise Pr ...
- [转] js async await 终极异步解决方案
阅读目录 回顾 Promise async await 字面理解 async.await 如何执行 await 操作符 总结 既然有了promise 为什么还要有async await ? 当然是pr ...
- Redux异步解决方案之Redux-Thunk原理及源码解析
前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现.但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案.本 ...
- 前端的异步解决方案之Promise和Await-Async
异步编程模式在前端开发过程中,显得越来越重要.从最开始的XHR到封装后的Ajax都在试图解决异步编程过程中的问题.随着ES6新标准的出来,处理异步数据流的解决方案又有了新的变化.Promise就是这其 ...
- 一个例子读懂 JS 异步编程: Callback / Promise / Generator / Async
JS异步编程实践理解 回顾JS异步编程方法的发展,主要有以下几种方式: Callback Promise Generator Async 需求 显示购物车商品列表的页面,用户可以勾选想要删除商品(单选 ...
随机推荐
- Agc003_E Sequential operations on Sequence
传送门 题目大意 $1,2...n,n$个数从小到大排列,有$m$此操作,每次操作给定一个参数$x$,将当且数列作为循环节无限地展开下去,再取前$x$个作为新的数列,求最终的数列每个数出现的次数. $ ...
- CH#56C 异象石 和 BZOJ3991 [SDOI2015]寻宝游戏
异象石 CH Round #56 - 国庆节欢乐赛 描述 Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上 ...
- 【Google】非下降数组
转自九章算法公众号 题目描述 给出包含n个整数的数组,你的任务是检查它是否可以通过修改至多一个元素变成非下降的.一个非下降的数组array对于所有的i(1<=i<n)满足array[i-1 ...
- VC++6.0注释快捷键的添加使用
在eclipse等编辑工具中都有注释代码的快捷键,但是vc++6.0没有. vc++是以VB为脚本来控制的,在网上找到了一个VB的脚本供大家使用. 工具/原料 VC++6.0 方法/步骤 打开VC ...
- debian软件安装和卸载
用root身份执行如下命令: dpkg -l |grep "^rc"|awk '{print $2}' |xargs aptitude -y purge dpkg是Debian P ...
- 【转】Pro Android学习笔记(十五):用户界面和控制(3):Button控件
目录(?)[-] 基础Button ImageButton ToggleButton CheckBox RadioButton 基础Button Button是最常用的基础控件之一,在Android中 ...
- RPM包及其管理 rpm命令
一.什么是RPMRPM:RedHat Package Manager //红帽包管理如果Linux发行版本是redhat .redflag .centos .fedora .suse等或者衍生 ...
- js浮点数运算出现误差解决方案
1.数据展示类(使用 toPrecision 凑整并 parseFloat 转成数字后再显示) parseFloat(1.4000000000000001.toPrecision(12)) === 1 ...
- [HDU1109]模拟退火算法
模拟退火的基本思想: (1) 初始化:初始温度T(充分大),初始解状态S(是算法迭代的起点),每个T值的迭代次数L (2) 对k=1,……,L做第(3)至第6步: (3) 产生新解$S\prime $ ...
- 6.docker常用命令
docker 常见命令 更细的配置请参考官方文档 第一大部分容器生命周期管理 01 .docker run :创建一个新的容器并运行一个命令 $ docker run [OPTIONS] IMAGE ...