js中的回调函数 和promise解决异步操作中的回调地狱问题。
回调函数 : 函数作为参数传递到另外一个函数中。简单数据类型和引入数据类型中的数组和对象作为参数传递大家肯定都不陌生,其实引用数据类型中的函数也是可以的。 事实上大家见到的很多,用到的也很多,比如jQuery中的一些事件,定时器。这些呢都是别人搞好的,大家直接用,所以就没有太在意。 /注意到click方法中是一个函数而不是一个变量 //它就是回调函数
$("#btn_1").click(function() {
alert("Btn 1 Clicked");
});
它也是回调函数
setInterval(function(){
console.log('回调函数')
})
回调函数是如何运作的呢?
我们把一个函数传入,那么这个函数什么时候执行,执行的条件是什么?
这个是由被调用的函数决定的,被调用函数可以在一个适当的条件去触发这个回调函数,
比如上诉点击事件,什么时候触发这个函数呢?那就是点击的时候,其实jQuery封装的时候,也可以函数调用的时候立马执行,也可以把传入的函数放入定时器,间隔一段事件执行,
那么这些毫无意义嘛!!!总之就是传入的这个函数执行条件,时间,同步或异步都可以随意控制,很强大。 回调函数其实也是闭包:
如何理解这个呢? 当我们把这个函数当参数传递到其他函数时候,那么其实会形成闭包的。大家想想闭包的概念,内部函数应用外包函数变量。当然其实传入的函数也不一定非要应用外部函数的变量。
function fn(id, check) {
info = {
id: id
}
console.log(id)
check(info)
} fn(1, function(data) {
console.log(data)
}) 上面是我写的一个简单的回调函数,当然没有任何意义啊,只是写出来便于看的,
其实上溯回调函数中还涉及到一个回调函数传值问题,fn函数调用的时候传入一个函数,这个函数调用时候,其实有一个传值问题
1传到上诉fn函数中,fn函数中的info同时也传到了fn调用中的data。 回调函数不好的影响:回调地狱
var p_client = new Db('integration_tests_20', new Server("127.0.0.1", 27017, {}), {'pk':CustomPKFactory});
p_client.open(function(err, p_client) {
p_client.dropDatabase(function(err, done) {
p_client.createCollection('test_custom_key', function(err, collection) {
collection.insert({'a':1}, function(err, docs) {
collection.find({'_id':new ObjectID("aaaaaaaaaaaa")}, function(err, cursor) {
cursor.toArray(function(err, items) {
test.assertEquals(1, items.length); // Let's close the db
p_client.close();
});
});
});
});
});
}); 上溯是随便拷贝的回调函数代码,这个是不是特别难看,而且不利于代码维护,如何解决这个问题呢?es6提供了解决方案,promise解决回调函数问题。 接下类在聊聊promise的使用吧。推荐大家可以看一看阮一峰的一片文章,什么文章我也不知道,但是你百度搜索:阮一峰es6。 为什么会有promise? 之前大家解决异步事件都是用回调函数去解决,就是说,写异步事件用回调函数去写。但是回调函数写异步会出现一些问题,
回调地狱的问题,上诉代码大家可以看到的。那么promise就是一种新的处理异步的方法,可以完美的解决回调函数处理异步带来的问题,回调地狱问题。
其实promise就是异步操作的方法,就像之前的定时器一样,看到定时器就知道这是异步操作,同样,看到promise就知道这个是异步操作。 什么是promise?
promise是一个构造函数 首先要构建一个promise对象
const promise = new Promise() 那马儿promise对象就建立好了 const promise = new Promise(function(resolve, reject) {
// ... some code if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
}); new promise 传入的参数一个是函数,函数中还有两个参数,这两个是函数,就是回调函数,什么时候执行呢?成功会执行resolved函数,失败执行reject函数,
成功时候可以传入参数,失败的时候也可以传入参数,value和error就是传入的参数,这两个参数可以通过promise .then和.catch方法绑定的函数中去获取,
成功的时候同时会调用.then方法并且把成功的参数传入到.then方法绑定的函数中去。.catch同理会这样。 、下面简单写了一个demon
var i = 1 function promise() {
const promise = new Promise(function(resolved, reject) { if (i === 1) {
resolved(i)
} else {
reject(1)
}
})
return promise
} console.log(23)
promise().then(function(value) {
console.log(value)
}).catch(function(value) {
console.log(value)
})
console.log(32)
js中的回调函数 和promise解决异步操作中的回调地狱问题。的更多相关文章
- jquery.Deferred promise解决异步回调
我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越 ...
- js中如何在一个函数里面执行另一个函数
1.js中如何在函数a里面执行函数b function a(参数c){ b(); } function b(参数c){ } 方法2: <script type="text/javasc ...
- underscore.js中的节流函数debounce及trottle
函数节流 throttle and debounce的相关总结及想法 一开始函数节流的使用场景是:放止一个按钮多次点击多次触发一个功能函数,所以做了一个clearTimeout setTimeou ...
- JavaScript -- 时光流逝(七):js中的全局函数
JavaScript -- 知识点回顾篇(七):js中的全局函数 全局函数可用于所有内建的 JavaScript 对象. (1) encodeURI():把字符串编码为 URI. <script ...
- js中的匿名函数和匿名自执行函数
1.匿名函数的常见场景 js中的匿名函数是一种很常见的函数类型,比较常见的场景: <input type="button" value="点击" id ...
- JS中关于把函数作为另一函数的参数的几点小总结
//JS中关于把函数作为函数的参数来传递的问题的小总结//第一,最简单的形式无参函数,直接形式函数的函数名放到括号中,再在执行部分这个函数即可.//当然调用时要穿另一个真正的定义好的函数/*funct ...
- js中的Generators函数
js中的Generators函数 generator一般操作 generator函数的作用就是函数体分段执行,yield表示分隔点 function *test() { console.log(1); ...
- js中回调函数,promise 以及 async/await 的对比用法 对比!!!
在编程项目中,我们常需要用到回调的做法来实现部分功能,那么在js中我们有哪些方法来实现回调的? 方法1:回调函数 首先要定义这个函数,然后才能利用回调函数来调用! login: function (f ...
- 关于jquery.unobtrusive-ajax.js 回调函数无效 的解决办法
今天新项目的时候写MVC的时候使用到了Ajax.BeginForm,发现它的回调函数怎么都不响应,最后在网上查找了相关资料跟自己写的一些代码测试, 总算找到了原因:jquery.unobtrusive ...
随机推荐
- kubelet工作原理
在调度这一步完成后,Kubernetes 就需要负责将这个调度成功的 Pod,在宿主机上创建出来,并把它所定义的各个容器启动起来.这些,都是 kubelet 这个核心组件的主要功能. kubelet ...
- 【学习】数据聚合和分组运算【groupby】
分组键可以有多种方式,且类型不必相同 列表或数组, 某长度与待分组的轴一样 表示DataFrame某个列名的值 字典或Series,给出待分组轴上的值与分组名之间的对应关系 函数用于处理轴索引或索引中 ...
- VS Code 1.18版本更新内容整理(2017年10月 October 2017)
久前开始使用的VS Code,使用一段时间以后确实感觉比之前在用的Sublime Text好很多,可能是汉化及插件方面使用做的更好吧. 今天推送到更新到1.18,按我的个性,喜欢一个东西的话,我就回去 ...
- Linux下的常见压缩解压缩命令
Linux常见压缩解压缩命令 常见压缩文件扩展名 .Z compress 程序压缩的文件: .zip zip 程序压缩的文件: .gz gzip 程序压缩的文件: .bz2 bzip2 程序压缩的文件 ...
- time模块的学习
time模块不在python35\lib的安装目录下,是因为该模块是用C语言编写,内置到python解释器中.各种时间格式相互转换关系: import time,datetime # print(ti ...
- pymysql操作
import pymysql conn_mysql = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456' ...
- [PHP+JS]微信卡券(潦草笔记,全代码,亲测通过)
群发卡券可以通过客服消息推送 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547 后端代码: define('A ...
- [Android]Linux下WebRTC下载与编译
1.硬盘空间: WebRTC官方原话: The checkout size is large due the use of the Chromium build toolchain and many ...
- Must practice programming questions in all languages
To master any programming languages, you need to definitely solve/practice the below-listed problems ...
- Linux 下安装 tomcat
前提:已经安装配置好了 JDK 1.下载二进制文件 wget http://us.mirrors.quenda.co/apache/tomcat/tomcat-9/v9.0.19/bin/apache ...