对es6中Promise和async的理解
Promise
var promise = new Promise((resolve,reject)=>{
resolve(value);
//reject(value)
});
//promise的状态由内部是否执行resolve(),reject(),或者报错决定
promise.then(value=>{
return value //等价于return Promise.resolve(value) 此时状态由pendding变为resolved
//return new Promise((resolve,reject)=>{}) 如果此时内部未执行resolve(),reject(),或者报错,promise.then返回的对象就是pendding状态
})
//这个方法返回一个promise对象,这个对象和promise不相等,这个promise的状态,由return决定
//如果return的是一个值,或者没有return(返回的是undefined),此时状态由pendding变为resolved
var promise = new Promise((resolve,reject)=>{
console.log(1);
resolve();
});
promise.then(()=>{
return Promise.all[new Promise(
(resolve,reject)=>{
console.log(2)
resolve();
}
),new Promise(
(resolve,reject)=>{
console.log(3)
resolve();
}
)]
}).then(()=>{
console.log(4)
})
promise.then(()=>console.log('end'))
// 1 2 3 end 4 1 2 3 end返回的promise都是基于 promise的,4基于的是promise.then(),事件队列的排列顺序是1,2,3,end,4
async function logInOrder(urls) {
// 并发读取远程URL
const textPromises = urls.map(url => {
return function(){
return new Promise((reslove)=>{
setTimeout(()=>reslove(url),1000);
});
};
});
let reslt=[];
// 按次序输出
for (const textPromise of textPromises) {
reslt.push(await textPromise());//此时才执行new Promise,执行定时器,await没有返回结果是不会执行后面的console.log的
console.log(reslt);
}
}
async
async function logInOrder(urls) {
// 并发读取远程URL
const textPromises = urls.map(url => {
return new Promise((reslove)=>{
setTimeout(()=>reslove(url),1000);
});
});
let reslt=[];
// 按次序输出
for (const textPromise of textPromises) {
reslt.push(await textPromise);//在map(非常快)的时候定时器已经开启,await只是等待resolve的执行,恰好遍历的定时器时间一样,并行打印
console.log(reslt);
}
}
var promise = new Promise((resolve,reject)=>{
resolve(url1);
});
if(false){ //或者true,可以用promise赋值的方式将新的promise的结果传给下面的then
promise = promise.then(value=>{
return new Promise((resolve)=>{
resolve(url2)
})
})
}
promise.then((value)=>{
})
扩展我自己写的一个Promise.props方法
// 直接在构造方法上定义静态方法
Promise.props = function(obj) {
if (typeof obj !== 'object') return new Promise((resolve)=>resolve(obj));
let keys = Object.keys(obj);
return Promise.all(keys.map(item=>obj[item])).then((value) => {
let foo={};
value.forEach((v,i)=>foo[keys[i]] = v);
return foo
});
}
Promise.props({
a: new Promise((resolve) => {
setTimeout(() => resolve(123), 1000)
}),
b: new Promise((resolve) => {
setTimeout(() => resolve(456), 1000)
})
}).then(value => console.log(value.a, value.b))
对es6中Promise和async的理解的更多相关文章
- ES6中Promise对象个人理解
Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...
- 对于ES6中Promise的个人见解
1.js中常见的异步 JavaScript可以响应用户的一些异步交互,比如单击鼠标和按键盘等操作. let button = document.getElementById("btn&quo ...
- 关于ES6的Promise的使用深入理解
ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...
- ES6中promise的使用方法
先看看ES5中异步编程的使用. let ajax = function (callBlack) { setTimeout(function () { callBlack && call ...
- ES6中promise总结
一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...
- ES6中的class类的理解
传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性共享给新对象.这样的写法相对于其它传统面向对象语言来讲,很有一种独树一帜的感脚!非常容易让人 ...
- 阿里前端测试题--关于ES6中Promise函数的理解与应用
今天做了阿里前端的笔试题目,原题目是这样的 //实现mergePromise函数,把传进去的数组顺序先后执行,//并且把返回的数据先后放到数组data中 const timeout = ms => ...
- ES6 中 Promise
在说Promise之前我们先简单说一下什么是同步异步? 同步(Sync):所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作. 异步(Async):异步与同步相对, ...
- ES6中Promise的入门(结合例子)
一.Promise的前言 解决回调地狱 //以往回调方式 函数1(function(){ //代码执行...(ajax1) 函数2(function(){ //代码执行...(ajax2) 函数3(f ...
随机推荐
- Running Spark on YARN
Running Spark on YARN 对 YARN (Hadoop NextGen) 的支持是从Spark-0.6.0开始的,后续的版本也一直持续在改进. Launching Spark on ...
- 我的Spring学习记录(四)
虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...
- 使用wsimport和JAX-WS调用Web Service接口
本文简单举例说明如何使用wsimport工具和JAX-WS API调用Web Service接口.此方法的优点:使用JDK自带的工具和API接口,无需依赖第三方库. JDK版本:1.8.0_141开发 ...
- DataGridView一些常用操作
SqlConnection conn = new SqlConnection('Server=(local);DataBase=test;User=sa;Pwd=sa'); SqlDataAdapte ...
- WPF第三方控件Telerik
帮助文档:http://www.telerik.com/help/wpf/gridview-selection-via-checkbox.html Telerik专注于微软.Net平台的表示层与内容管 ...
- 部署LAMP+NFS实现双Web服务器负载均衡
一.需求分析 1.前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器: 2.虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台 ...
- SQL server 数据库备份大
首先简单的介绍一下Sql server 备份的类型有: 1:完整备份(所有的数据文件和部分的事务日志文件) 2:差异备份(最后一次完成备份后数据库改变的部分) 3:文件和文件组备份(对指定的文件和文件 ...
- WDA的配置
WDA的配置 SAP的技术总是搞得很复杂,WDA的涉及到配置如下: 1. Internet Communication Manager 确认ICM中提供的HTTP/HTTPS运行正常. Tcode: ...
- ASP.NET没有魔法——ASP.NET MVC IoC
之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...
- 最佳时间买入卖出股票 Best Time to Buy and Sell Stock LeetCode
LeetCode 我们有一个股票的数组,数组是每时间的钱,我们只能买入一次和卖出一次,求我们的最大收益. 我们知道了一个数组,那么我们可以在低价买入,然后高价卖出,但是需要知道我们的低价需要在高价之前 ...