promise,await,async小论
Promise:
Promise为了解决异步回调地狱而生的,其解决方法就是链式调用promise.then()或promise.all();
Promise有两个参数,resolve和reject,第一个代表正确的返回处理,第二个代表异常的返回处理!
function promise1(){
let num = 0;
return new Promise((resolve,reject)=>{
setTimeout(()=>{
num++;
resolve(num);
},3000);
});
}
promise1().then((num)=>{
console.log(num);
});
3秒后输出结果是1。
then方法里有两个参数,第一个是resolve,第二个是reject,resolve可以返回一个promise,也可以直接返回一个data,直接返回的data会作为接下来的then里的resolve的形参传递。
function promise1(){
let num = 0;
return new Promise((resolve,reject)=>{
setTimeout(()=>{
num++;
resolve(num);
},3000);
});
}
function promise2(num){
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
num+=3;
resolve(num);
},3000);
});
return p;
}
function promise3(num){
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
num *= num;
resolve(num);
},3000);
});
return p;
}
promise1().then((num)=>{
console.log(num);
return promise2(num);
}).then((num)=>{
console.log(num);
return promise3(num);
}).then((num)=>{
console.log(num);
return 3;
}).then((num)=>{
console.log(num);
}).then((num)=>{
console.log(num);
});
输出结果

第4个then直接返回第三个then返回的数字3,而最后一个num形参没有传递任何数据,故是undefined。
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调,注意这个类似是静态方法,直接通过Promise.all关键词调用
Promise.all([promise1(),promise2(2),promise3(6)]).then((result)=>{
console.log(result);
});
结果:

用Promise.all来执行,all接收一个数组参数,里面的值最终都返回Promise对象。这样,三个异步操作的并行执行的,等到它们都执行完后才会进到then里面。那么,三个异步操作返回的数据哪里去了呢?都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then,就是上面的results
还有个race方法,all方法的效果实际上是「谁跑的慢,以谁为准执行回调」,那么相对的就有另一个方法「谁跑的快,以谁为准执行回调」,这就是race方法,这个词本来就是赛跑的意思。
promise的这种链式调用可以很好的解决回调地狱的问题!
async、await
这两个玩意解决异步回调简直是完美!
async只能放到函数前面,await只能出现在标有async的函数里,意思就是等待!async函数和正常的function一样使用,如果内部有await 那么可以抛出错误处理
async function timeout(){
let cc = await func();
}
timeout().catch(error){
console.log(error);
}
await可以使当前代码暂停执行,等到await 后的代码处理完后再继续向下执行,await后的方法返回的是Promise对象,也可以是自己定义的含有then方法的对象
function promiseAwt(num){
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
let cnt = 0;
while(num > 0){
cnt += num;
num--;
}
resolve(cnt);
},num);
});
return p;
}
async function timeout(){
let cc = await promiseAwt(3000);
console.log('道德经');
let dd = await promiseAwt(1000);
console.log("天之道");
let ee = await promiseAwt(2000);
console.log(`cc:${cc}\ndd:${dd}\nee:${ee}`);
}
timeout();
console.log("我先执行");
输出结果

如果现场试验你会发现,先输出 “我先执行” 等待3秒输出“道德经”,再等待1秒输出‘天之道’,再等待2秒输出累加的和 cc、dd、ee,程序在执行await的时候等待了!
await 最后得到的值就是promise的resolve传递过来的参数!
下面是综合测试:
function promise1(){
let num = 0;
return new Promise((resolve,reject)=>{
setTimeout(()=>{
num++;
resolve(num);
},3000);
});
}
function promise2(num){
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
num+=3;
resolve(num);
},3000);
});
return p;
}
function promise3(num){
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
num *= num;
resolve(num);
},3000);
});
return p;
}
Promise.all([promise1(),promise2(2),promise3(6)]).then((result)=>{
console.log(result);
});
function promiseAwt(num){
let p = new Promise((resolve,reject)=>{
setTimeout(()=>{
let cnt = 0;
while(num > 0){
cnt += num;
num--;
}
resolve(cnt);
},num);
});
return p;
}
async function timeout(){
let cc = await promiseAwt(3000);
console.log('道德经');
let dd = await promiseAwt(1000);
console.log("天之道");
let ee = await promiseAwt(2000);
console.log(`cc:${cc}\ndd:${dd}\nee:${ee}`);
promise1().then((num)=>{
console.log("sssss:"+num);
return promise2(num);
}).then((num)=>{
console.log("nnnn:"+num);
return promise3(num);
}).then((num)=>{
console.log("hello world----"+num);
});
}
timeout();
console.log("我先执行");
输出结果

promise,await,async小论的更多相关文章
- yield 异步 并行 Promise await async
yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称.平等的 http://www.geeksforgeeks.org/use-yield-keyword-instead-ret ...
- 【ES6】 Promise / await / async的使用
为什么需要在项目中引入promise? 项目起因:我们在页面中经常需要多次调用接口,而且接口必须是按顺序串联调用 (即A接口调用完毕,返回数据后,再调用B接口) 这样就会造成多次回调,代码长得丑,而且 ...
- node.js异步控制流程 回调,事件,promise和async/await
写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...
- promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解
* promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...
- 重构:从Promise到Async/Await
摘要: 夸张点说,技术的发展与历史一样,顺之者昌,逆之者亡.JS开发者们,赶紧拥抱Async/Await吧! GitHub仓库: Fundebug/promise-asyncawait 早在半年多之前 ...
- Promise, Generator, async/await的渐进理解
作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...
- 异步操作之 Promise 和 Async await 用法进阶
ES6 提供的 Promise 方法和 ES7 提供的 Async/Await 语法糖都可以更好解决多层回调问题, 详细用法可参考:https://www.cnblogs.com/cckui/p/99 ...
- Promise及Async/Await
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...
- callback vs async.js vs promise vs async / await
需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...
- 详解promise、async和await的执行顺序
1.题目和答案 一道题题目:下面这段promise.async和await代码,请问控制台打印的顺序? async function async1(){ console.log('async1 sta ...
随机推荐
- web学习(2019-10)
@“fuzz一下”:所有注入爆破题/其他题,必fuzz 在安全测试中,模糊测试(fuzz testing)是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型 模糊测试(fuzz tes ...
- hbase的hue部署和使用
1.组件版本信息 zookeeper hadoop hbase hue zookeeper-3.4.12 hadoop-3.0.3 hbase-2.1.5 4.4.0 2. ...
- 通过java 来实现对多个文件的内容合并到一个文件中
现在有多个txt文本文件,需要把这么多个文件的内容都放到一个文件中去 以下是实现代码 package com.SBgong.test; import java.io.*; public class F ...
- 【Linux-驱动】printk的打印级别
级别: 日志级别用宏表示,日志级别宏展开为一个字符串,在编译是由预处理器将它和消息本文拼接成一个字符串,因此printk函数中日志级别宏和格式字符串间不能有逗号.printk的日志级别定义在 /inc ...
- mysql事件(event)
[小结]简单案例 SET GLOBAL event_scheduler=1delimiter $$ create definer = current_user event `test`.`event_ ...
- Linux中使用curl命令发送带参数的get请求和post请求
GET 请求 curl命令 + 请求接口的地址 curl http://**.**.***.**/SeedAgile/SeedApi/querySprintByRequirementNo?parame ...
- Eclipse快速生成do while if 等方法
选中所需要加方法的代码 右键 选中 surrounded with选择你需要就可以了
- 最简单的方式实现rem布局
加上如下js,px转换成rem需要手动,计算方式:量的大小除以100,就等于rem,例如:量的设计稿元素宽度是120,那么就写成{width: 1.2rem},这样写有什么问题,待研究,也欢迎补充 & ...
- java中怎么跳出两层for循环
使用标号(使用标号跳出两层或者多层for循环): outterLoop: for (int i = 0; i < 9; i++){ for (int j = 0; j & ...
- 物联网的语言c,python,go等
日本生鱼片 电热水器的使用方法http://www.hiry.cn/b/mt/33959.html 物联网层次很多,首先要看你从事哪个层级的工作了.既然你问语言,那么肯定是开发类的工作,开发类的对象中 ...