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 目录 异步编程的简介 异 ...
随机推荐
- Robot Framework(6)——案例分层
上一篇以gogomall的登录为例,记录了一个简单的登录流程的脚本,在实际应用中,当流程发生一些小的变动,或者前端代码改变,导致元素选择器失效,我们维护脚本的成本就比较大,需要一个一个去修改,所以,有 ...
- pandas 数据库数据的读取
绝大多数公司都会选择将数据存入数据库中,因为数据库既可以存放海量数据,又可以非常便捷地实现数据的查询.下面以MySQL和SQL Server为例,来练习Pandas模块和 对应的数据库模块. 首先需要 ...
- 修改注册表修改环境变量PATH
因公司办公电脑做了权限设置,不能通过右击“我的电脑”-属性的方式更改环境变量值 摸索找到了通过修改注册表的方式修改PATH值 Win+R 输入regedit打开册表编辑器 HKEY_LOCAL_M ...
- 学习seo技术要不断地扩大思维和思路
http://www.wocaoseo.com/thread-148-1-1.html 目前学习seo技术的人员是越来越多了,通过查看seo这个词的指数,就能发现一些状况,从最初的每天3 ...
- Python Selenium 之数据驱动测试的实现
数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据.可以将测 ...
- vue 中PDF实现在线浏览,禁止下载,打印
需求:在线浏览pdf文件,并且禁止掉用户下载打印的效果. 分析:普通的iframe.embed标签都只能实现在线浏览pdf的功能,无法禁止掉工具栏的下载打印功能.只能尝试使用插件,pdfobject. ...
- Mono生命周期小实验
今天在写代码的时候,遇到一个初始化顺序问题,于是做了一个实验,下面记录结果: 情景: 1.在 脚本A中实例化 一个预制体,该预制体挂有脚本B 2.在 脚本A中,获取实例化物体 身上的 脚本B,并且设置 ...
- Explain Plan试分析
注:以下是本人对Explain Plan的试分析,有不对的地方希望大家指出.关于如何查看Oracle的解释计划请参考:https://www.cnblogs.com/xiandedanteng/p/1 ...
- 【Flutter 实战】1.20版本更新及新增组件
老孟导读:Flutter 1.20 更新了 Slider.RangeSlider.日期选择器组件.时间选择器组件的样式,新增了交换组件:InteractiveViewer,下面详细介绍其用法. 滑块 ...
- 原生js实现jquery的siblings()
Element.prototype.siblings = function(callback){ var siblingElement = []; var parentAllElement = []; ...