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小论的更多相关文章

  1. yield 异步 并行 Promise await async

    yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称.平等的 http://www.geeksforgeeks.org/use-yield-keyword-instead-ret ...

  2. 【ES6】 Promise / await / async的使用

    为什么需要在项目中引入promise? 项目起因:我们在页面中经常需要多次调用接口,而且接口必须是按顺序串联调用 (即A接口调用完毕,返回数据后,再调用B接口) 这样就会造成多次回调,代码长得丑,而且 ...

  3. node.js异步控制流程 回调,事件,promise和async/await

    写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...

  4. promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解

    * promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...

  5. 重构:从Promise到Async/Await

    摘要: 夸张点说,技术的发展与历史一样,顺之者昌,逆之者亡.JS开发者们,赶紧拥抱Async/Await吧! GitHub仓库: Fundebug/promise-asyncawait 早在半年多之前 ...

  6. Promise, Generator, async/await的渐进理解

    作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...

  7. 异步操作之 Promise 和 Async await 用法进阶

    ES6 提供的 Promise 方法和 ES7 提供的 Async/Await 语法糖都可以更好解决多层回调问题, 详细用法可参考:https://www.cnblogs.com/cckui/p/99 ...

  8. Promise及Async/Await

      一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...

  9. callback vs async.js vs promise vs async / await

    需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...

  10. 详解promise、async和await的执行顺序

    1.题目和答案 一道题题目:下面这段promise.async和await代码,请问控制台打印的顺序? async function async1(){ console.log('async1 sta ...

随机推荐

  1. 【Linux开发】linux设备驱动归纳总结(八):4.总线热插拔

    linux设备驱动归纳总结(八):4.总线热插拔 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  2. Java 虚拟机的运行模式

    这几天在读周志明老师的<深入理解JVM虚拟机> 讲到了 java的运行模式, 有mixed 模式 interpret模式还有compile模式.效果如下面所示 java -version ...

  3. DBGridEh列宽自动适应内容的简单方法

    ///////Begin   Source      uses          Math;            function   DBGridRecordSize(mColumn:   TCo ...

  4. // TODO Auto-generated method stub 作用及设置

    当我们创建一个主方法类时,eclipse会默认插入一条注释语句: // TODO Auto-generated method stub 作用: // TODO Auto-generated metho ...

  5. Spring Boot 五种热部署方式,极速开发就是生产力!

    1.模板热部署 在 Spring Boot 中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭 ...

  6. sql实现同时向主表和子表插入数据方法

    使用sql语句实现同时向主表和子表插入数据方法: Oracle: -- oracle创建sequence create sequence SEQ_test minvalue 1 maxvalue 99 ...

  7. thinkphp5.1 关于加载静态资源路径问题

    和thinkphp5.0不一样,thinkphp5.1的 thinkphp5.0的 直接在config.php文件中加入代码: <?phpreturn [ 'view_replace_str' ...

  8. cookie,session,token的理解

    Get  POST 区别异同点 淘宝token的 理解   过程算法 防止伪造请求  伪造相对难 简单发展史  登录的操作: 哪些人往自己的购物车中放商品,  也就是说我必须把每个人区分开,这就是一个 ...

  9. redis 学习(8)-- redis 客户端 -- Jedis

    redis 客户端 -- Jedis 1. Jedis 直连 本质是 TCP 连接. 执行流程 创建Jedis对象 通过Jedis执行命令 返回Jedis执行结果 关闭Jedis连接 demo 要使用 ...

  10. 什么是blazor

    blazor是一个微软推出的基于webassembly和C#(面向对象) 以及F#(面向函数)的前端框架 它类似vue react anglar的单页前端框架 只是他不再使用js 或typescrip ...