面试之Promise对象
1.promise相关的状态,promise.all()方法如何执行的?如果promise列表中有一个promise reject会怎么样?
pending,resolved,rejected;状态只会从pending=>resolved;pending=>rejected.
Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
补充:
一.promise细则
1.Promise 对象使用:
Promise((resolve,reject)=>{resolve(),reject()});
2.内置方法:
1.then(function,function)(接受resolve或reject)
2.catch用来捕获错误或者reject
所以一般不建议reject写在then里,而是写在catch里。
3.Promise.all()处理一组promise对象
such as:p = [p1,p2,p3]
另外,如果p1有catch,p1会在catch之后变成resolved,也就是说,p的catch并不会执行。
二.Generator 和 asyn
1.Generator生成的是一个迭代器,可以用for(of)遍历,或者用next(),每次next()都会执行yield语句。
catch()捕获内部的错误,无法捕捉语句外的。
用法:
function *gen(){
yield ...;
return .....;//这个语句不算在for(of)迭代里;
}
eg:Generator产生斐波那契:
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
yield curr;
[prev, curr] = [curr, prev + curr];
}
}
for (let n of fibonacci()) {
if (n > 10) break;
console.log(n);
}
2.asyn可以看做Generator的语法糖:
一比较就会发现,async
函数就是将 Generator 函数的星号(*
)替换成async
,将yield
替换成await
,仅此而已。
用法:let gen = asyn function(){
await ...
}