浅谈promise的三种状态和定义数据var let const 的区别

160 阅读3分钟

浅谈一下promise的三个状态

1.pending进行中

pending。他的意思是待定的,将发生的,相当于一个初始状态。
创建promise对象时,且没有调用resolve或者reject时,会一直在初始状态。这个初始状态会随着调用resolve或者reject函数切换到另一个状态

let p = new Promise((resolve, reject) => {
})
console.log(p);//此时打印Promise {<pending>}

这个初始状态可以理解为对别人说出承诺的那个瞬间,说的这个时候,大家都不知道这个承诺是否能兑现

2.成功状态fulfilled

fulfilled,表示解决了,也就是这个承诺实现了,要实现从pending到fulfilled的转变,需要在创建promise对象时,在函数体中调用resolve方法(即第一个参数)

let p = new Promise((resolve, reject) => {
    resolve(123)
})
console.log(p);//此时打印Promise {<fulfilled>: 123}

3.失败状态rejected

rejected。失败拒绝,表示这个承诺没有做到,要实现从pending到rejected的转变,需要在创建promise对象时,调用reject方法

let p = new Promise((resolve, reject) => {
    reject(123)
})
console.log(p);//此时打印Promise {<rejected>: 123}

promise三种状态小结

1.状态可转化
创建时默认状态是pending,如果在函数体内部调用了第一个参数对应的函数,那么状态就变成fulfilled成功状态; 如果调用了第二个参数对应的函数,则变成rejected

pending ---- resolve() -->fulfilled
pending ---- reject() -->rejected

2.状态是不可逆的 一旦从pending转换到fulfilled或者是rejected,就不可能回到pending,也不能有fulfilled变成rejected

下面是let,var,const的区别

let和const是es6新增的声明变量的关键词,之前声明变量的关键词是var

作用域的区别

var定义变量在函数外部 , 是全局变量
函数内部定义的变量 是局部变量 只在函数内部有效
需要注意 if判断 for循环里var定义的变量 没有局部作用域 全局可以访问

var a=10;
console.log(window.a);

function testFn(c) {
    var b = 5;
    console.log(b);
    console.log(c);
}
testFn(100);
console.log(b);

if (true) {
    var a = 0;
}
console.log(a);// 0
for (let i = 0; i < 10; i++) {
    var a = 10;
}
console.log(a);// 10

let 定义的变量 只在let所在的代码块内有效

if (true) {
   let a = 10; 
   console.log(a);// 10
}
console.log(a);// error
变量提升
// var拥有变量提升 提前调用会打印undefined
// let没有变量提升 没有声明就调用会报错

console.log(a);
var a = 10;
// 相当于
var a;
console.log(a);
a = 10

console.log(b)
let b = 1; //error

关于重复声明

// var声明的变量 可以重复赋值
// let声明的变量 不能重复赋值,否则执行报错
var a = 1;
a = 2;
a = 10;
console.log(a) //20
let a = 20 //error 

const声明常量

const声明一个只读的常量。一旦声明,常量的值就不能改变。

// const声明即赋值,不可先声明后赋值
const a;//error
const b = 1;
b = 2;//不可改变b error

const的作用域和let相同。 只在声明的块级作用域内有效

常量不能改变指的是指向的地址不可变,但是我们只是改变里面的值,堆空间地址没变,所以是可以改变对象里的值的

const obj = {
  name: 'hhh',
  age: 18
}
obj.name = 'lll';// 这里只是改变了对象里的内容,指向没有改变 
console.log(obj.name);// '111'
const obj = {// error 改变了obj的指向地址
  name:'yxw'
}

有帮助到的话留下你的点赞吧