mysql回调地狱_es6 promise 所见
回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称——回调地狱。
var sayhello = function(name, callback) {
setTimeout(function() {
console.log(name);
callback();
},1000);
}
sayhello("first", function() {
sayhello("second", function() {
sayhello("third", function() {
console.log("end");
});
});
});//输出: first second third end
promise是用来解决两个问题的:
回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
promise可以支持多个并发的请求,获取并发请求中的数据
这个promise可以解决异步的问题,本身不能说promise是异步的
二、es6 promise用法大全
Promise是一个构造函数,自己身上有 all, reject, resolve 这几个眼熟的方法,原型上有 then, catch 等方法。
let p = new Promise((resolve, reject) => {
//做一些异步操作
setTimeout(() => {
console.log('执行完成');
resolve('我是成功!!');
}, 2000);
});
Promise的构造函数接收一个参数:函数,并且这个函数需要传入两个参数:resolve :异步操作执行成功后的回调函数
reject:异步操作执行失败后的回调函数
then 链式操作的用法
所以,从表面上看,Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:
p.then( (data) => {
console.log(data);
})
.then( (data) => {
console.log(data);
})
.then( (data) => {
console.log(data);
});
reject的用法 :
把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。看下面的代码。
let p = new Promise((resolve, reject) => {
//做一些异步操作
setTimeout(function(){
var num = Math.ceil(Math.random()*10); //生成1-10的随机数
if(num<=5){
resolve(num);
}
else{
reject('数字太大了');
}
}, 2000);
});
p.then((data) => {
console.log('resolved',data);
},(err) => {
console.log('rejected',err);
}
);
then中传了两个参数,then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调。
所以我们能够分别拿到他们传过来的数据。多次运行这段代码,你会随机得到下面两种结果:
或者
catch的用法
我们知道Promise对象除了then方法,还有一个catch方法,它是做什么用的呢?
其实它和then的第二个参数一样,用来指定reject的回调。用法是这样:
p.then( (data) => {
console.log('resolved' , data)
}). catch( (err) => {
console.log('rejected' , err)
})
效果和写在then的第二个参数里面一样,不过它还有第二个作用: 在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常(代码出错了),那么并不会报错卡死js,而是会进入到这个catch方法中。
p.then( (data) => {
console.log('resolved', data);
console.log(somedata);//此处的somedata的定义
})
.catch( (err) => {
console.log('rejected', err)
})
在resolve的回调中,我们console.log(somedata);而somedata这个变量是没有被定义的。如果我们不用Promise,代码运行到这里就直接在控制台报错了,不往下运行了。但是在这里,会得到这样的结果:
也就是说进到catch方法里面去了,而且把错误原因传到了reason参数中。即便是有错误的代码也不会报错了,这与我们的try/catch语句有相同的功能
all的用法:谁跑的慢,以谁为准执行回调。
all接收一个数组参数,里面的值最终都算返回Promise对象
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完成才执行回调。
看下面的例子:
let Promise1 = new Promise( function(resolve, reject) { });
let Promise2 = new Promise( function(resolve, reject) { });
let Promise3 = new Promise( function(resolve, reject) { });
let p = Promise.all( [Promise1, Promise2, Promise3] )
p.then(function() {
//三个都成功则成功
},{
//只要有失败,则失败
})
race的用法:谁跑的快,以谁为准执行回调
race的使用场景:比如我们可以用race给某个异步请求设置超时时间,并且在超时后执行相应的操作,代码如下:
//请求某个图片资源
function requestImg(){
var p = new Promise( (resolve, reject) => {
img.onload = function(){
resolve(img);
}
img.src = '图片的路径';
});
return p;
}
//延时函数,用于给请求计时
function timeout() {
var p = new Promise( (resolve, reject) => {
setTimeout( () => {
reject('图片请求超时');
},5000)
});
return p;
}
Promise.race([requestImg(), timeout()].then( (data) =>{
console.log(data);
}).catch( (err) => {
console.log(err);
})
)
mysql回调地狱_es6 promise 所见相关推荐
- 【JavaScript】回调地狱、Promise
文章目录 1. 回调函数 2. 异步任务 3. 回调地狱 4. Promise 4.1 Promise定义 4.2 Promise基础用法 4.2.1 生成Promise实例 4.2.2 Promis ...
- 详解回调地狱以及promise
1.什么是回调地狱? 说promise之前必须先简单说下,回调地狱 回调地狱:在回调函数中又嵌套了多层回调函数,便会形成回调地狱 JS中或node中,都大量的使用了回调函数进行异步操作,而异步操作什么 ...
- ES6(三)——回调地狱和promise异步任务顺序执行(传参、错误处理)
文章目录 方法一.回调函数(回调地狱) 方法二:promise 2.1异步任务传参(单个) 2.2异步任务传参(多个) 2.3 错误处理 2.4 Promiss对象三大状态: (学名) 2.5 Pro ...
- 回调地狱终结者——Promise
在Web前端开发中,我们使用JavaScript会大量依赖异步计算.比如说,Ajax请求时,我们可能会需要不只一个请求来达到某种目的,此时需要后面的请求依赖于前面请求的结果.这种情况在简单的业务中并无 ...
- 回调地狱和Promise
目录 1.回调地狱callback-hell 由于fs.readFile是异步操作,所以你不能判断下面三个文件的执行顺序 var fs = require('fs')fs.readFile('./da ...
- mysql回调地狱_浅谈JS回调地狱
前言: 回调地狱称之为callback hell 主体: (1)分析 由图分析可知,内部的异步请求依赖于上一个内部请求的结果 (2)编写案例 本节内容主要涉及 异步编程 1.简单回调案例 2.node ...
- 回调地狱与promise
<script src="js/ajax.js"></script><script>// function fn(a){// a()// }// ...
- mysql回调地狱_5、Express异步读取Mysql数据库 callback/promise/async
一.Node异步 Node.js 异步编程的直接体现就是回调. 有了异步方法,我们可以一边操作数据库,一边执行其他命令,在数据库操作完成后,我们将查询数据作为回调函数的参数返回.这样在执行代码时就没有 ...
- 什么是回调地狱以及promise的链式调用和aysnc/await
上面一篇博客写到了回调地域的问题,这篇博客将深究这个词语,如下例: doSomething(function(result){doSomethingElse(result, function(newR ...
- 【Callback Hell】一文让你轻松了解何为回调地狱?
回调地狱[Callback Hell] 前提知识点: 单线程和异步: JS是单线程语言,只能同时做一件事儿 (例子:做一个ajax请求去加载资源,或者说弄一个定时器,先等待1秒钟后干嘛,如果按照单线程 ...
最新文章
- 交换机使用QoS来对端口限速
- C# List Sort
- Java并发编程的基础-Thread.interrupted
- Window7+vs2008+QT环境搭建
- Halcon—Tuple中符号的含义
- 产品总监如何做产品规划?
- Android 入门篇(一)环境搭建
- java和C#的相同之处笔记
- uni-app android权限
- UEFI开发之应用开发
- Android数据库框架Sugar的使用
- 解析中小学生的 AI 思维学习模型
- Invalid format specifier的解决方法
- FreeBie—免费设计师专用素材网
- 受伤的皇后(八皇后问题)
- 傲气雄鹰android 3dm,傲气雄鹰 重载
- java:去除数组重复元素的四种方法
- Leecode-SQL 1407. 排名靠前的旅行者
- Very Good!!! - React 入门实例教程
- Server2012R2下安装intel 82579v网卡驱动