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 目录 异步编程的简介 异 ...
随机推荐
- 2020.5.24 第四篇 Scrum冲刺博客
Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...
- linux字符终端(控制台)的字体更改
查看已安装的终端字体 ls /usr/share/consolefonts/ 设置终端字体 sudo dpkg-reconfigure console-setup 或者 sudo vim /etc/d ...
- 【洛谷日报#26】GCC自带位运算系列函数
文章转自 洛谷 谈到GCC的黑科技,大家想到的一定是这句: #pragma GCC optimize (3)//吸氧 抑或是这句: #pragma GCC diagnostic error " ...
- UI 科学
以简书为案例讲述「尼尔森十大可用性原则」 http://www.jianshu.com/p/a45e4ad68e20 你真的懂得尼尔森的十大可用性原则么? http://jy.sccnn.com/po ...
- Laravel5的验证码功能
第三方扩展包 mews/captcha 作为基础来实现 Laravel 中的验证码功能 安装 注册 配置验证码文件 前端引用 后端验证 安装前准备(我这边没执行这个,安装成功,但是搜到的文件有写,不清 ...
- leetcode刷题-58最后一个单词
题目 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度.如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在最后一个单词,请返回 0 . 说明:一 ...
- TP6.0中的密码验证逻辑、验证器的使用
目录 1. 场景一:只有一个密码框,并且是可选项,留空不修改密码,不留空则修改密码 2. 场景二:两个密码框,修改密码时有新密码.确认密码,新密码框不为空时,确认密码才验证 1. 场景一:只有一个密码 ...
- 安卓自动化测试工具Monkey简单使用
一.首先安装adb 地址:http://www.downza.cn/soft/219906.html安装到D盘下,安装的过程中自己注意下不要安装上全家桶.找到这个压缩包:解压到当前文件夹: 二.将ad ...
- oracle数据处理之sql*loader(一)
SQL*Loader是oracle提供的可以从多种平面文件中向数据库中加载数据的工具,它比较适合业务分析类型数据库(数据仓库);使用sqlldr工具可以在很短的时间内向数据库中加载大量的数据,像把制作 ...
- 自定义 NSLog以便发版和调试
问题 开发中用了大量的 NSLog,但是发布时想取消这些 NSLog 开发中是否经常用过 NSLog(@"%s", __FUNCTION__); 解决问题 新建 ExtendNSL ...