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 ...
随机推荐
- 【Linux开发】linux设备驱动归纳总结(八):4.总线热插拔
linux设备驱动归纳总结(八):4.总线热插拔 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- Java 虚拟机的运行模式
这几天在读周志明老师的<深入理解JVM虚拟机> 讲到了 java的运行模式, 有mixed 模式 interpret模式还有compile模式.效果如下面所示 java -version ...
- DBGridEh列宽自动适应内容的简单方法
///////Begin Source uses Math; function DBGridRecordSize(mColumn: TCo ...
- // TODO Auto-generated method stub 作用及设置
当我们创建一个主方法类时,eclipse会默认插入一条注释语句: // TODO Auto-generated method stub 作用: // TODO Auto-generated metho ...
- Spring Boot 五种热部署方式,极速开发就是生产力!
1.模板热部署 在 Spring Boot 中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭 ...
- sql实现同时向主表和子表插入数据方法
使用sql语句实现同时向主表和子表插入数据方法: Oracle: -- oracle创建sequence create sequence SEQ_test minvalue 1 maxvalue 99 ...
- thinkphp5.1 关于加载静态资源路径问题
和thinkphp5.0不一样,thinkphp5.1的 thinkphp5.0的 直接在config.php文件中加入代码: <?phpreturn [ 'view_replace_str' ...
- cookie,session,token的理解
Get POST 区别异同点 淘宝token的 理解 过程算法 防止伪造请求 伪造相对难 简单发展史 登录的操作: 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开,这就是一个 ...
- redis 学习(8)-- redis 客户端 -- Jedis
redis 客户端 -- Jedis 1. Jedis 直连 本质是 TCP 连接. 执行流程 创建Jedis对象 通过Jedis执行命令 返回Jedis执行结果 关闭Jedis连接 demo 要使用 ...
- 什么是blazor
blazor是一个微软推出的基于webassembly和C#(面向对象) 以及F#(面向函数)的前端框架 它类似vue react anglar的单页前端框架 只是他不再使用js 或typescrip ...