function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done');
});
}
timeout(500).then((value) => {
console.log(value)
});
//上面代码中,timeout方法返回一个Promise实例,表示一段时间以后才会发生结果.
//过了指定时间后(ms参数),Promise实例的状态变为Resolved,就会触发then
//方法绑定的回调函数.
//--------------Promise的执行顺序----------------//
let promise = new Promise((resolve, reject) => {
console.log('Promise');
resolve();
});
promise.then(() => {
console.log('resolved');
})
console.log('Hi');
//-----------------Promise Ajax操作-------------//
const getJSON = function (url) {
const promise = new Promise((resolve, reject) => {
const handler = function () {
if (this.readyState !== 4) {
return;
}
if (this.status === 200) {
resolve(this.response);
} else {
reject(new Error(this.statusText));
}
};
const client = new XMLHttpRequest();
client.open('GET', url);
client.onreadystatechange = handler;
client.responseType = "json";
client.setRequestHeader("Accept", "application/json");
client.send();
});
return promise;
}
getJSON("/posts.json").then(function (json) {
console.log('Contents: ' + json);
}, function (error) {
console.error('出错了', error);
});
//---------------2个Promise状态 传递------------------------//
const p1 = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error('fail')), 3000)
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => resolve(p1), 1000)
});
p2.then(result => console.log(result))
.catch(error => console.log(error.toString()));
//上面代码中,p1是一个Promise 3秒之后变为rejected. p2的状态在1秒后改变.
//Resolve方法返回的是p1.由于p2返回的是另一个Promise.导致p2自己的状态无效了.
//由p1的状态决定p2的状态.所以,后面的then语句都变成了针对p1.又过了2秒
//p1变为rejected 导致触发catch方法指定的回调函数
//-------------then()函数-----------------//
const p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('step 1');
}, 1000);
})
p3.then((value) => {
console.log(value);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('step 2');
}, 1000)
// setTimeout(()=>resolve('step 2'),1000);
})
}).then(function (value1) {
console.log(value1)
});
//-------------catch()函数---------------//
//catch 就是 then(null,reject)的别名
getJSON('/fake.json').catch(function (error) {
console.log('error happen', error.toString())
})
const someAsyncThing = function () {
return new Promise(function (resolve, reject) {
resolve(y + 2);
});
};
someAsyncThing().then(function () {
console.log('everything is great');
}).catch(function (error) {
console.log(error.toString())
});
//浏览器运行到这一行,会打印出错误提示ReferenceError: x is not defined,
//但是不会退出进程、终止脚本执行,2 秒之后还是会输出123。
//这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,
//通俗的说法就是“Promise 会吃掉错误”。
//-------------finally--------------//
const p5 = new Promise((resolve, reject) => {
resolve(123);
})
p5
.then(function (result) {
console.log(result);
})
.finally(() => { console.log('finally') })
console