promise介绍

ES6教程传送门:http://es6.ruanyifeng.com/#docs/promise

Promise是什么?

Promise是一个构造函数,用于创建Promise对象
Promise对象:可以理解为一个处理异步操作的容器
promise本质 不是控制异步代码的执行顺序(无法控制) , 而是控制异步代码结果处理的顺序
Promise作用:解决回调地狱
回调地狱:异步回调层层嵌套

promise使用

使用流程
1.创建promise实例对象

 let p = new Promise( (resolve,reject)=>{ //异步操作 } )

2.调用实例对象的then方法

 p.then(data=>{ //处理成功数据 } , err=>{ //处理失败结果 })

promise有三种状态

  • pending(进行中)
  • fulfilled(已成功)
  • rejected(已失败)

Promise状态改变只有两种情况(过程不可逆)

  • 从pending(进行中)变为fulfilled(成功)
  • 从pending(进行中)变为rejected(失败)

注意点

  • Promise对象在创建的时候,里面的异步就会立即执行
  • 不要在创建promise的时候处理异步结果,应该调用resolve()或者reject()交给then()方法来处理
  • promise解决回调地狱 : 在上一个promise的then方法中返回下一个promise实例对象

需求:依次读取abcd四个文件

const fs = require('fs');//Promise是一个构造函数,用于创建promise实例//(1)调用Promise构造函数,生成promise实例对象
/*
参数:回调函数  (resolve,reject)=>{  //你想要的异步操作 }resolve : 完成回调reject  : 失败回调
*/
let p1 = new Promise((resolve, reject) => {//异步操作: 读取文件afs.readFile(`${__dirname}/data/a.txt`, 'utf8', (err, data) => {if (!err) {//成功/* (1)resolve:执行then方法里面的第一个函数(2)resolve底层原理:修改promise状态从pending(进行中)变为fulfilled(成功)*/resolve(data);} else {//失败/* (1)reject:执行then方法里面的第二个函数(2)rreject底层原理:修改promise状态从pending(进行中)变为rejected(失败)*/reject(err);}});
});let p2 = new Promise((resolve, reject) => {//异步操作: 读取文件afs.readFile(`${__dirname}/data/b.txt`, 'utf8', (err, data) => {if (!err) {//成功resolve(data);} else {//失败reject(err);}});
});let p3 = new Promise((resolve, reject) => {//异步操作: 读取文件afs.readFile(`${__dirname}/data/c.txt`, 'utf8', (err, data) => {if (!err) {//成功resolve(data);} else {//失败reject(err);}});
});let p4 = new Promise((resolve, reject) => {//异步操作: 读取文件afs.readFile(`${__dirname}/data/d.txt`, 'utf8', (err, data) => {if (!err) {//成功resolve(data);} else {//失败reject(err);}});
});//(2)调用promise实例的then方法//第一个参数: 成功的回调
//第二个参数: 失败的回调
p1.then(data=>{console.log(data);return p2;//在第一个promise的then方法中返回第二个promise对象
})
.then(data=>{//p2的thenconsole.log(data);return p3;
})
.then(data=>{//p3的thenconsole.log(data);return p4;
})
.then(data=>{//p4的thenconsole.log(data);
});
  • promise本质不是修改异步的顺序(异步永远是无序的),而是通过控制异步结果的顺序,从而实现异步代码有序执行。

Promise的方法

  • catch():捕捉then方法中的错误err
  • all():将多个Promise对象放入数组合并成一个promise要等所有的promise全部执行完毕才会执行then()
  • race() :将多个promise对象放入数组中合并成一个promise race: 任何一个promise执行完毕就会执行then():
/* 需求 : 依次读取abcd四个文件
*/const fs = require('fs');//Promise是一个构造函数,用于创建promise实例//封装一个创建promise的函数
function createPromise(filename){return new Promise((resolve,reject)=>{fs.readFile(`${__dirname}/data/${filename}.txt`, 'utf8', (err, data) => {if (!err) {//成功resolve(data);} else {//失败reject(err);}});});
};let p1 = createPromise('a');
let p2 = createPromise('b');
let p3 = createPromise('c');
let p4 = createPromise('d');//(2)调用promise实例的then方法
//第一个参数: 成功的回调
//第二个参数: 失败的回调
p1.then(data=>{console.log(data);return p2;//在第一个promise的then方法中返回第二个promise对象
})
.then(data=>{//p2的thenconsole.log(data);return p3;
})
.then(data=>{//p3的thenconsole.log(data);return p4;
})
.then(data=>{//p4的thenconsole.log(data);
})
.catch(err=>{//catch : 上面任何一个then出错了都会进入这个方法console.log(err);
});//all()方法
//Promise.all([p1,p2,p3,p4]) : 多个promise合成一个
let pAll = Promise.all([p1,p2,p3,p4]);//(2)调用promise实例的then方法pAll.then(data=>{//执行时机: pAll中所有的promise全部都完成才会执行then//data : 数组。 数组中每一个元素就是每一个promise的结果console.log(data);});//race方法```js
//Promise.all([p1,p2,p3,p4]) : 多个promise合成一个
let pAll = Promise.race([p1,p2,p3,p4]);//(2)调用promise实例的then方法pAll.then(data=>{//执行时机: pAll中 任何一个 promise完成就会执行then//data : 第一个执行完毕的promise的结果console.log(data);});

数组降维

数组降维就是把一个二维数组变成一维数组

方式一:数组的concat()拼接数组

 /* 二维数组 : 数组每一个元素都是一个数组*/let arr = [['a', 'b', 'c'],['d', 'e', 'f'],['g', 'h', 'i'],];console.log(arr);// 降维;//方式一:数组的concat()拼接数组let newArr = [];for (let i = 0; i < arr.length; i++) {newArr = newArr.concat(arr[i]);}console.log(newArr);

方式二:ES6拓展运算符

二维数组 : 数组每一个元素都是一个数组*/let arr = [['a', 'b', 'c'],['d', 'e', 'f'],['g', 'h', 'i'],];console.log(arr);//方式二:使用ES6的拓展运算符 ...let newArr = [];for (let i = 0; i < arr.length; i++) {newArr.push(...arr[i]);}console.log(newArr);let newarr=[].concat(...arr1 );console.log(newarr)

多维数组降维一维数组

超过二维以上数组,暂且称它为多维数组

方式一 : 使用 reduce

遍历数组每一项,若值为数组则递归遍历,否则concat。

function flatten(arr) {  return arr.reduce((result, item)=> {return result.concat(Array.isArray(item) ? flatten(item) : item);}, []);
}

reduce是数组的一种方法,它接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

reduce包含两个参数:回调函数,传给total的初始值

// 求数组的各项值相加的和:
arr.reduce((total, item)=> {  // total为之前的计算结果,item为数组的各项值return total + item;
}, 0);

方式二:toString/ join & split

调用数组的toString/join 方法,将数组变为字符串然后再用split分割还原为数组

//toString
function flatten(arr) {return arr.toString().split(',').map(function(item) {return Number(item);})
}
//join
function flatten(arr) {return arr.join().split(',').map(function(item) {return Number(item);})
}

因为split分割后形成的数组的每一项值为字符串,所以需要用一个map方法遍历数组将其每一项转换为数值型

方式三: 递归

递归的遍历每一项,若为数组则继续遍历,否则concat

function flatten(arr) {var res = [];arr.map(item => {if(Array.isArray(item)) {res = res.concat(flatten(item));} else {res.push(item);}});return res;
}

方式四:扩展运算符
es6的扩展运算符能将二维数组变为一维
根据这个结果我们可以做一个遍历,若arr中含有数组则使用一次扩展运算符,直至没有为止。

function flatten(arr) {while(arr.some(item=>Array.isArray(item))) {arr = [].concat(...arr);}return arr;
}

总结
虽然说写了4种方法,但是核心也只有一个:
遍历数组arr,若arr[i]为数组则递归遍历,直至arr[i]不为数组然后与之前的结果concat。

数组升维

一维数组生成二维获者多维

利用对象的特点实现数组去重

对象特点
obj.name 取值 : 有:取值 没有:undefined
obj.name = 1 赋值 : 有:修改 没有:动态添加
对象的属性名不能重复

 let arr1 = [88, 20, 66, 50, 90, 88, 20, 66];let obj = {}; //利用属性名不能重复特点实现数组去重let newArr = [];for (let i = 0; i < arr1.length; i++) {if (!obj[arr1[i]]) {//!undefined=true  obj.name 取值 :  有:取值  没有:undefinedobj[arr1[i]] = 1; // obj.name = 1  赋值 : 有:修改  没有:动态添加newArr.push(arr1[i]);}}console.log(newArr);

未升维之前的一维数组

 //数组的降维 ,多用于对后端数据的重新整理var arr = [{type: '电子产品',name: 'iPhone',price: 8888}, {type: '家具',name: ' 桌子',price: 100}, {type: '食品',name: '瓜子',price: 10}, {type: '家具',name: '椅子',price: 380}, {type: '电子产品',name: '小米手机',price: 1380}, {type: '食品',name: '辣条',price: 5}, {type: '食品',name: '咖啡',price: 50}];// 声明一个空对象,及空数组var obj = {};var arrNew = [];arr.forEach(item => {if (obj[item.type] == undefined) { // 第一次出现 判断对象中是否含有obj[item.type] = 1; //赋值arrNew.push({type: item.type,data: [item]})} else { // 不是第一次出现// 判断当前的item2属于arrNew中的那一类arrNew.forEach((item2, index2) => {if (item.type == item2.type) {arrNew[index2].data.push(item2) //在该对象的data中添加}})}})

升维后的数组

Promise、数组的升维与降维相关推荐

  1. numpy的array数组的数据升维与降维使用方法自学总结

    本文主要介绍numpy中数据升维与降维问题 升维 注意数组的形式 是n行1列 还是1行n列 1.numpy.atleast_2d(数组名) 将输入视为至少具有二维的数组 2.numpy.atleast ...

  2. 张量的基本概念+张量的聚合、拼接、比较、随机化采样、序列化等操作+升维、降维

    张量的基本概念+张量的聚合.拼接.比较.随机化采样.序列化等操作 一.张量的基本概念 二.张量的聚合操作 三.张量的拼接操作 张量的升维.降维 一.张量的基本概念 张量(Tensor),就是多维数组. ...

  3. 核函数是什么-数据的升维与降维

    核函数是什么-数据的升维与降维 核函数是什么-数据的升维与降维 数据升维-从二维空间升维到三维希尔伯特空间 将二维空间数据x=(xi,xj)x=(x^i,x^j)x=(xi,xj)升到三维,因此需要映 ...

  4. 为什么TransFormer中的FFN有两层,先升维再降维?

    为什么FFNN有两层,先升维再降维?   Self-Attention模型的作用是提取语义级别的信息(不存在长距离依赖),FFNN实际上就是简单的MLP.唯一需要注意的是这个MLP的修饰词--Poin ...

  5. numpy数据升维与降维

    https://blog.csdn.net/weixin_44776220/article/details/105618704

  6. 数组的降维与升维方法

    数组的降维与升维方法 数组的降维 数组的升维 数组的降维 <script>// 二维数组降维var arr = [[12, 78, 56],[78, 89],[2, 3]];var arr ...

  7. 张量(Tensor)的降维与升维

    一.Tensor的降维--torch.squeeze()函数 1.tensor的维度 小编对于张量的理解一直很模糊,今天用Excel来帮助大家理解,希望对大家有所帮助. 首先,张量是多维数组,这里不多 ...

  8. 哈儿小波分解和重构(降维和升维)实现算法

    [0]README 0.1)本文旨在讲解 哈儿小波变换(分解和重构)进行数据的降维和升维: [timestamp: 1703281610]时隔几个月再来review 哈儿小波变换算法的具体思路: 1) ...

  9. element js 包含字符_携程春招题目字符串截取和数组升维

    编程风格 简单陈述一下文中代码使用的编程风格: 使用 ES5,以避免有些在线编程平台不支持 ES6 的状况(所以在这里没有用 new Set()) Airbnb 代码规范,不使用单 var 模式 变量 ...

最新文章

  1. 转:Yaf 路由协议
  2. Okhttp3-网络请求流程解析
  3. C# :异步编程的注意点
  4. 用matlab求解工作时间调度问题,置换流水车间调度问题的MATLAB求解.doc
  5. keepalived实现高可用nginx反向代理的简单案例
  6. HTTP之Redirect和Location头使用(C++ Qt框架实现)
  7. HDU1976 Software Version【水题】
  8. python科学计算之Pandas使用(一)
  9. python定义一个字符串数组_python 变量,数组,字符串
  10. 小莫qq影视机器人-自定义对接影视教程
  11. 计算机类银行招聘考试考什么科目,计算机专业参加银行招聘考试要考哪些科目,除了行..._银行招聘考试_帮考网...
  12. 【历史上的今天】9 月 20 日:中国正式接触互联网;抖音上线;中科大成立
  13. 手机总是显示服务器太忙,手机总提示服务器太忙请稍后重试
  14. modules node 太大了_解决node_modules文件名太长无法删除的两个方法-文件名太长
  15. developer.biao.daily.20140731
  16. 【MySQL】DML,DQL
  17. 《五月集训》第十四天——栈
  18. mysql没有for循环语句(使用while替代)
  19. Android 实践:做一款新闻 APP
  20. BLE协议栈 – SM

热门文章

  1. 微软BI 之SSIS 系列 - 平面文件格式的区别(Delimited,Fixed width,Ragged Right, Fixed width ...)...
  2. windows下将文件压缩成.tar.gz格式
  3. 如何将视频变成gif?视频在线转换gif动图的方法
  4. MYSQL常用基本SQL语句总结。
  5. C/C++编程学习 - 第4周 ④ 0与1
  6. 群体智能自主作业智慧农场项目启动及实施方案论证会议
  7. [XJTU计算机网络安全与管理]第一讲 网络安全概述
  8. 2-08 PHP_MySQL入门到精通教程I理论篇(上)下载
  9. 区块链行业:2020基于区块链技术的供应链金融白皮书(20201231).PDF
  10. #gStore-weekly | 自建房监管知识图谱