pormise和async
pormise
1.异步问题
假设现在我刚认识你,需要和你说话,但是我普通话不够标准,需要间隔一秒钟才能说一句话,以此让你可以慢慢思考。这样的话我们就需要用到定时器。
最沙雕的代码如下:
setTimeout(
function(){
console.log('你好,我是saoge');
setTimeout(
function(){
console.log('很高兴认识你');
setTimeout(
function(){
console.log('交个朋友吧');
},1000)
},1000)
},1000)
但是这种代码,是根本没有可读性的。因此我们还有另一种写法。
function helloOne(next){
setTimeout(function(){
console.log('你好,我是saoge');
next();
},1000)
}
function helloTow(next){
setTimeout(function(){
console.log('你好,很高兴认识你');
next();
},1000)
}
function helloThree(){
setTimeout(function(){
console.log('交个朋友吧');
},1000)
}
helloOne(function(){
helloTow(function(){
helloThree()
})
})
用回调函数来实现代码看上去会有逻辑性的多,但是在调用的时候也会存在层层嵌套的问题,如果这个时候我是个话痨,要和你说很多据话,那么用回调函数写出来的代码也是相当恐怖的,而且采用这种方式并不能很方便的改变执行的顺序等。总而言之就是因为总总不好,所以出现了更好的方式promise。
使用Promise
使用new来创建一个Promise的实例。
var promise = new Promise(function(resolve,reject){
setTimeout(function(){
resolve('你好,我是saoge');
reject(new Error('发生错误'));
// if(false){
// resolve('你好,我是saoge');
// }else{
// reject(new Error('发生错误'))
// }
},1000)
})
promise.then(function(data){
console.log(data);
},function(err){
console.log(err)
})
//使用catch
promise.then(function(data){
console.log(data);
}).catch(function(err){
console.log(err);
})
我们来一步一步的分析上述案例。
在上述实例中,Promise传入了两个形参 resolve 和 reject 这两个参数的回调,代表成功和失败,如果执行正常,就调用resolve,否则就调用reject。上代码:
var promise = new Promise(function(resolve,reject){
//成功时调用resolve
//失败时调用reject
})
同时,promise实例具有then方法,then方法接受两个参数,第一个参数时resolve执行成功的回调,第二个参数reject 是执行失败的回调。
因此,在上述案例中,最终会输出 "你好我是骚哥"
我们可以用if语句来模拟一下执行失败的情况,这个时候输出的就是 Error:发生错误
同时,Promise实例还提供了一个catch()方法,该方法和then()方法接收的第二个参数一样,用来执行reject的回调。
var promise = new Promise(function(resolve,reject){
//成功时调用resolve
//失败时调用reject
})
promise.then( resolve的回调 , reject 的回调(可选) );
promise.catch(reject的回调);
我们用Promise来实现一下最初对话的案例。
function helloOne() {
return new Promise(
function(next) {
setTimeout(function() {
console.log('你好,我是saoge');
next();
}, 1000)
})
}
function helloTwo() {
return new Promise(
function(next) {
setTimeout(function() {
console.log('你好,很高兴认识你');
next();
}, 1000)
})
}
function helloThree() {
return new Promise(
function(next) {
setTimeout(function() {
console.log('交个朋友吧');
next();
}, 1000)
})
}
helloOne().then(helloTwo).then(helloThree);
和使用回调的区别在于,我们将要执行的代码放在了Promise实例中,这样,在我们最后需要执行的时候,只需要用then()方法去调用即可,语法结构简单,即使我想说再多的话也不会造成代码结构混乱。且在这里使用了Promise方法之后,如果是我想要改变代码执行顺序的话只需要改变then()方法传入的值即可。
异步之间传参
function hello(){
var text='你好,我是saoge';
setTimeout(function(){
console.log(text);
say(text);
},1000)
}
function say(text){
setTimeout(function(){
console.log(text)
},1000)
}
hello();
Promise在执行成功的时候,会调用resolve,因此,我们就可以用resolve来传值。
var pro = new Promise((resolve, reject) => {
setTimeout(function() {
var text = '你好,我是saoge';
console.log(text);
resolve(text);
}, 1000)
})
pro.then(function(data) {
setTimeout(function() {
console.log(data);
}, 1000)
})
需要等待多个函数执行完毕再执行时:Promise.all()
function helloOne() {
return new Promise(
function(next) {
setTimeout(function() {
console.log('你好,我是saoge');
next();
}, 1000)
})
}
function helloTwo() {
return new Promise(
function(next) {
setTimeout(function() {
console.log('你好,很高兴认识你');
next();
}, 2000)
})
}
function helloThree() {
return new Promise(
function(next) {
setTimeout(function() {
console.log('交个朋友吧');
next();
}, 3000)
})
}
Promise.all([helloOne(),helloTwo(),helloThree()]).then(function(){
setTimeout(function(){
console.log('可以吗?')
},1000)
});
上面这段代码就会先在一秒钟我说出你好,我是骚哥。然后再过一秒钟我说你好,很高兴认识你。再过一秒钟说出交个朋友吧,我们可以看到在then()方法里面有一个函数,是一秒钟之后询问你可以吗?而这句话执行的时间是第四秒。也就是Promise.all中的函数执行完成之后再去执行hten()方法中的语句。
Promise.race()
function helloOne() {
return new Promise(
function(next) {
setTimeout(function() {
console.log('你好,我是saoge');
next();
}, 1000)
})
}
function helloTwo() {
return new Promise(
function(next) {
setTimeout(function() {
console.log('你好,很高兴认识你');
next();
}, 2000)
})
}
function helloThree() {
return new Promise(
function(next) {
setTimeout(function() {
console.log('交个朋友吧');
next();
}, 3000)
})
}
Promise.race([helloOne(),helloTwo(),helloThree()]).then(function(){
setTimeout(function(){
console.log('可以吗?')
},1000)
});
看上面这个例子,执行一秒之后输出“你好,我是骚哥”,然后再过一秒钟会输出两句话,“你好,很高兴认识你”,“可以吗?”,最后再输出“交个朋友吧” 可以看出,在helloOne执行完毕之后,then()中的代码就开始执行了,和Promise.all()的不同就在于,只要有一个执行成功就去执行hten()中的代码。
async
1.async干了什么
async function helloOne(){
setTimeout(function(){
return("你好,我是骚哥");
},1000)
}
console.log(helloOne()) //Promise {<fulfilled>: undefined}
async 返回的是一个Promise对象。
async function helloOne(){
setTimeout(function(){
return("你好,我是骚哥");
},1000)
}
console.log(helloOne()); //Promise {<fulfilled>: undefined}
helloOne().then(function(data){
console.log(data) //undefined
})
我们尝试用then()去获取async函数中的值,但是返回的是undefined,且两个输出语句是同时执行的,所以说then()中的函数还没有等到异步函数执行完便执行了,因此这里和Promise不太一样。
function helloOne() {
return new Promise((resolve,reject)=>{
setTimeout(
function(){
resolve( '你好,我是saoge');
}, 1000)
});
}
function helloTwo(){
setTimeout(
function(){
return '拜拜';
}, 1000)
}
async function say(){
var one = await helloOne()
console.log(one) //你好,我是saoge
var two = await helloTwo()
console.log(two) //undefined
}
say()
直接看代码,可以发现,如果await 后面跟的是一个Promise对象,那么将会等到Promise对象resolve,然后将resolve的值作为表达式的结果。如果不是以恶搞promise对象,那么await的运算结果就是此时传入的东西,兵不会有其他作用。
pormise和async的更多相关文章
- async函数解析
转载请注明出处:async函数解析 async函数是基于Generator函数实现的,也就是说是Generator函数的语法糖.在之前的文章有介绍过Generator函数语法和异步应用,如果对其不了解 ...
- Promise及Async/Await
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...
- ES2017 中的 Async 和 Await
ES2017 在 6 月最终敲定了,随之而来的是广泛的支持了我最喜欢的最喜欢的JavaScript功能: async(异步) 函数.如果你也曾为异步 Javascript 而头疼,那么这个就是为你设计 ...
- vue结合Promise及async实现高效开发。
在vue中平时的开发中我们应该都会遇到promise函数,比如我们常用的axios,resource这都是用来做http请求的插件. 在平时的开发里,关于axios我们可能是这样写的 import a ...
- 异步Promise及Async/Await最完整入门攻略
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪圈, ...
- 异步Promise及Async/Await可能最完整入门攻略
此文只介绍Async/Await与Promise基础知识与实际用到注意的问题,将通过很多代码实例进行说明,两个实例代码是setDelay和setDelaySecond. tips:本文系原创转自我的博 ...
- [C#] async 的三大返回类型
async 的三大返回类型 序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task&l ...
- async & await 的前世今生(Updated)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...
- [.NET] 利用 async & await 的异步编程
利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html 目录 异步编程的简介 异 ...
随机推荐
- .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中
目录 .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中 前言 笔者最近在开发和维护一个.NET Core项目,其中使用几个非常有意思的.NET Core相关的扩展,在 ...
- 目标追踪(Object Tracking)概念的简要介绍
现在我们有一个视频流,可以拆解出 N 个帧出来,这时候初始帧/某一帧中出现了一个我们感兴趣目标,我们希望在后续帧中对这个目标进行追踪,这时候就需要 CV 中的目标追踪: 目标追踪的效果如下: 虽然效果 ...
- JVM大作业5——指令集
JVM的每一个线程都有一个虚拟机栈,方法调用时,JVM会在虚拟机栈内为该方法创建一个栈帧. 一条线程,只有正在执行的方法对应的栈帧时可活动的,这个栈帧被称为当前栈帧,当前栈帧对应的方法被称为当前方法, ...
- tensorflow1.x及tensorflow2.x不同版本实现验证码识别
近一个假期,入坑深度学习,先从能看得着的验证码识别入门.从B站看了几天的黑马程序员的“3天带你玩转python深度学习后“,一是将教程中提到的代码一一码出来:二是针对不同的tensorflow版本,结 ...
- C/C++ MFC
C++ & MFC(转载) C++是一种静态数据类型检查的.支持多重编程范式的程序设计语言,支持过程化程序设计.数据抽象.面向对象程序设计.制作图标等泛型程序设计的多种程序设计风格. MF ...
- 从APP的启动说起
iOS里面APP的启动,过程有些复杂,今天我们来抽丝剥茧,一步步探讨一下APP的启动会经历哪些过程. 首先,用户点击iPhone里面的某个APP的icon,Kernel内核会开始初始化空间并创建进程, ...
- vue路由守卫+cookie实现页面跳转时验证用户是否登录----(二)设置路由守卫
上一篇我们已经封装好了cookie方法,登录成功之后也可以吧用户信息存到cookie中,接下来需要在router/index.js中引入一下cookie.js文件 然后继续添加以下代码 /* * be ...
- Photon Server伺服务器在LoadBalancing的基础上扩展登陆服务
一,如何创建一个Photon Server服务 参见此博客 快速了解和使用Photon Server 二, 让LoadBalancing与自己的服务一起启动 原Photonserver.config文 ...
- Linux安装doker
docker安装(centos) 官方文档:https://docs.docker.com/engine/install/centos/ 前提条件 内核系统3.10以上的centos7.可用 unam ...
- [BUUOJ记录] [HCTF 2018]WarmUp
BUUOJ Web的第一题,其实是很有质量的一道题,但是不知道为什么成了Solved最多的题目,也被师傅们笑称是“劝退题”,这道题的原型应该是来自于phpMyadmin的一个文件包含漏洞(CVE-20 ...