const p1 = new Promise((resolve) => {
resolve('resovle1');
}).then(res => {
return 'adaa'; // 新的promise实例,其resolve值为'adaa'
}).finally(res => {
console.log(res); // undefined
return 'vsv'; // 无用
}).then(res => {
console.log(res); // adaa
})
const p1 = new Promise((resolve) => {
setTimeout(() => {
resolve('resolve3');
console.log('timer1')
}, 0)
resolve('resovle1');
resolve('resolve2');
}).then(res => {
console.log(res) // resolve1
setTimeout(() => {
console.log(p1) // promise( undefined)
}, 1000)
}).finally(res => {
console.log('finally', res)
})
需要注意的是最后一个定时器打印出的 p1 其实是.finally 的返回值(BTW如果没有这个finally,定时器打印的promsie值也是undefined,因为then没有返回东西),我们知道.finally的返回值如果在没有抛出错误的情况下默认会是上一个 Promise 的返回值,而这道题中.finally 上一个 Promise 是.then(),但是这个.then() 并没有返回值,所以 p1 打印出来的 Promise 的值会是 undefined,如果在定时器的下面加上一个 return 1,则值就会变成 1。
const async1 = async () => {
console.log('async1');
setTimeout(() => {
console.log('timer1')
}, 2000)
await new Promise(resolve => {
console.log('promise1')
})
console.log('async1 end')
return 'async1 success'
}
console.log('script start');
async1().then(res => console.log(res));
console.log('script end');
Promise.resolve(1)
.then(2)
.then(Promise.resolve(3))
.catch(4)
.then(res => console.log(res))
setTimeout(() => {
console.log('timer2')
}, 1000)
输出结果如下:
script start
async1
promise1
script end
1
timer2
timer1
代码的执行过程如下:
const p1 = new Promise((resolve) => {
resolve('resovle1');
}).then(res => {
console.log(res) // resolve1
}).then(res => {
console.log('finally', res) // finally undefined
})
采用链式的 then,可以指定一组按照次序调用的回调函数。这时,前一个回调函数,有可能返回的还是一个 Promise 对象(即有异步操作),这时后一个回调函数,就会等待该 Promise 对象的状态发生变化,才会被调用。
getJSON("/post/1.json").then(function(post) {
return getJSON(post.commentURL);
}).then(function (comments) {
console.log("resolved: ", comments);
}, function (err){
console.log("rejected: ", err);
});
上面代码中,第一个 then 方法指定的回调函数,返回的是另一个 Promise 对象。这时,第二个 then 方法指定的回调函数,就会等待这个新的 Promise 对象状态发生变化。如果变为 resolved,就调用第一个回调函数,如果状态变为 rejected,就调用第二个回调函数。
function a() {
console.log(this);
}
a.call(null);
打印结果:window 对象
根据 ECMAScript262 规范规定:如果第一个参数传入的对象调用者是 null 或者 undefined,call 方法将把全局对象(浏览器上是 window 对象)作为 this 的值。
要注意的是,在严格模式中,null 就是 null,undefined 就是 undefined:
'use strict';
function a() {
console.log(this);
}
a.call(null); // null
a.call(undefined); // undefined
使用 new 构造函数时,其 this 指向的是全局环境 window。
var obj = {
name : 'cuggz',
fun : function(){
console.log(this.name);
}
}
obj.fun() // cuggz
new obj.fun() // undefined
function fun() {
console.log(this); // [object Object] {da: "aa"}
(function lala(){
console.log(this === window);// true
})()
}
fun.call({da:'aa'})
//
window.number = 2;
var obj = {
number: 3,
db1: (function(){
console.log('1',this===window);
this.number *= 4;
return function(){
console.log('4', this===window);
this.number *= 5;
}
})()
}
console.log('2',number);
const db = obj.db1;
console.log('3',number);
db();
console.log('5',number);
// "1" true
// "2" 8
// "3" 8
// "4" true
// "5" 40