回调定义

就是一个函数里面使用 作为参数的函数。

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的更多相关文章

  1. ES6学习笔记(十二)异步解决方案Promise

    1.Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了P ...

  2. 异步解决方案----Promise与Await

    前言 异步编程模式在前端开发过程中,显得越来越重要.从最开始的XHR到封装后的Ajax都在试图解决异步编程过程中的问题.随着ES6新标准的到来,处理异步数据流又有了新的方案.我们都知道,在传统的aja ...

  3. JS异步解决方案

    前言 异步最早的解决方案是回调函数,如ajax,事件的回调,setInterval/setTimeout中的回调.但是回调函数有回调地狱的问题; 为了解决回调地狱的问题,社区提出了Promise解决方 ...

  4. CDC不同模式在ODI体现系列之二 异步模式

    CDC不同模式在ODI体现系列之二 异步模式 2 异步模式需要在数据库中做一些准备工作: 改数据为归档并启用logminer: SQL> shutdown immediate 数据库已经关闭. ...

  5. js async await 终极异步解决方案

    既然有了promise 为什么还要有async await ? 当然是promise 也不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. 回顾 Promise Pr ...

  6. [转] js async await 终极异步解决方案

    阅读目录 回顾 Promise async await 字面理解 async.await 如何执行 await 操作符 总结 既然有了promise 为什么还要有async await ? 当然是pr ...

  7. Redux异步解决方案之Redux-Thunk原理及源码解析

    前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现.但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案.本 ...

  8. 前端的异步解决方案之Promise和Await-Async

    异步编程模式在前端开发过程中,显得越来越重要.从最开始的XHR到封装后的Ajax都在试图解决异步编程过程中的问题.随着ES6新标准的出来,处理异步数据流的解决方案又有了新的变化.Promise就是这其 ...

  9. 一个例子读懂 JS 异步编程: Callback / Promise / Generator / Async

    JS异步编程实践理解 回顾JS异步编程方法的发展,主要有以下几种方式: Callback Promise Generator Async 需求 显示购物车商品列表的页面,用户可以勾选想要删除商品(单选 ...

随机推荐

  1. 关于对H264码流的TS的封装的相关代码实现

    1 写在开始之前 在前段时间有分享一个H264封装ps流到相关文章的,这次和大家分享下将H264封装成TS流到相关实现,其实也是工作工作需要.依照上篇一样,分段说明每个数据头的封装情况,当然,一样也会 ...

  2. URAL1517Freedom of Choice(后缀数组)

    Background Before Albanian people could bear with the freedom of speech (this story is fully describ ...

  3. 51nod 1149 Pi的递推式 组合数

    题目大意: \(F(x) = 1 (0 \leq x < 4)\) \(F(x) = F(x-1) + F(x-\pi) (4 \leq x)\) 给定\(n\),求\(F(n)\) 题解: 我 ...

  4. bzoj 2823: [AHOI2012]信号塔 最小圆覆盖

    题目大意: 给定n个点,求面积最小的园覆盖所有点.其中\(n \leq 10^6\) 题解: 恩... 刚拿到这道题的时候... 什么???最小圆覆盖不是\(O(n^3)\)的随机增量算法吗????? ...

  5. codevs 3372 选学霸

    3372 选学霸  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果 ...

  6. BZOJ2288:[POJ Challenge]生日礼物

    浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  7. bzoj 2597 剪刀石头布 —— 拆边费用流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 不合法的三个人之间的关系就是一个人赢了两次: 记 \( deg[i] \) 表示第 \ ...

  8. DataGrid 支持字符截断显示

    DataGrid支持截断时, 需要分2部分, DataGridColumnHeader和DataGridCell. 1)创建上述2部分的ControlTemplate . 2)把其中的ContentP ...

  9. java代码Math.sqrt

    总结:这个判断小数的题目,当时全只2有一个人想出了结果.老师很开心.我很桑心~~~~ 我没想到要取膜,我只想到了除以等于0就够了.至于中间的“取膜”,我没凑齐来,还是不够灵活 package com. ...

  10. Nginx正则表达式之匹配操作符详解

    nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能.例如:防止rewrite.盗链.对静态资源设置缓存以及浏览器限制等等.由于nginx配置中有if指令,但是没有对应else指令,所以 ...