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. 1.2.2 OSI参考模型 上

    一.HCNA网络技术学习指南 为了实现网络的互通及各种各样的网络应用,网络设备需要运行各种各样的协议已实现各种各样具体的功能.面对各种各样且数量繁多的功能,我们可以从网络架构的角度,引入功能分层的模型 ...

  2. python 连接Oracle 的步骤

    1. 安装 cx_Oracle pip install cx_Oracle 2.配置  oci.dll 与 oraociei11.dll 添加到环境变量path中 下载地址:百度搜索下载,Oracle ...

  3. SpringBoot配置文件值植入

    <!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐> <dependency> <groupId>org.springframework.boot</ ...

  4. 获取JSON中所有的KEY

    采用递归的方式,遍历JSON中所有的KEY. JSON格式如下: {"username":"tom","age":18,"addr ...

  5. Java小知识----List复制:浅拷贝与深拷贝

    原文地址: https://blog.csdn.net/demonliuhui/article/details/54572908 List浅拷贝 众所周知,list本质上是数组,而数组的是以地址的形式 ...

  6. C++学习 之 类的继承中的虚函数(笔记)

    1.多态行为 多态是面向对象语言的一种特征,让我们能够以类似的方式处理不同类型的对象.在C++中我们可以通过继承层次结构实现子类型多态. 我们可以通过下面的代码进一步了解多态: #include< ...

  7. C++练习 | 基于栈的中缀算术表达式求值(double类型

    #include<iostream> #include<stack> #include<cmath> using namespace std; char ch; b ...

  8. JavaEE--JavaWeb三大组件Servlet、Filter、Listener

    Servlet.Filter.Listener是JavaEE Web服务规定的服务器动态组件,由开发者编写由Web容器创建,并保证单例以及线程安全性,其中加载顺序为Linstener -> Fl ...

  9. C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)

    希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...

  10. Mysql学习(二)之通过homebrew安装mysql后,为什么在系统偏好设置里没有mysql

    原因 用brew install packagename是用来安装命令行工具的,一般不可能影响到图形界面. mysql官方文档是通过dmg文件安装的: The MySQL Installation P ...