/*
什么时候适合用 Promise 而不是传统回调函数?
当需要多次顺序执行异步操作的时候,例如,如果想通过异步方法先后检测用户名和密码,
需要先异步检测用户名,然后再异步检测密码的情况下就很适合 Promise。
*/
/*Promise 是一个 ECMAScript 6 提供的类,
目的是更加优雅地书写复杂的异步任务。*/
//函数瀑布
// setTimeout(function () {
// console.log("First");
// setTimeout(function () {
// console.log("Second");
// setTimeout(function () {
// console.log("Third");
// }, 1000);
// }, 2000);
// }, 1000);
//使用promise来改进
new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("First");
resolve();
}, 1000);
})
.then(function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("Second");
resolve();
}, 2000);
});
})
.then(function () {
setTimeout(function () {
console.log("Third");
}, 1000);
});
//当Promise被构造时,起始函数会被异步执行
new Promise(function (resolve, reject) {
console.log("Run");
}); //Run
//resolve和reject都是函数,其中resolve代表一切正常
//reject是出现异常时所调用的
new Promise(function (resolve, reject) {
var a = 0;
var b = 1;
if (b == 0) reject("Diveide zero");
else resolve(a / b);
})
.then(function (value) {
//参数value是resolve的结果
console.log("a / b =" + value);
})
.catch(function (err) {
//参数err是reject的结果
console.log(err);
})
.finally(function () {
console.log("End");
}); //结束
/*Promise 类有 .then() .catch() 和 .finally() 三个方法,
这三个方法的参数都是一个函数,
.then() 可以将参数中的函数添加到当前 Promise 的正常执行序列,
.catch() 则是设定 Promise 的异常处理序列,.finally() 是在 Promise 执行的最后一定会执行的序列。
.then() 传入的函数会按顺序依次执行,有任何异常都会直接跳到 catch 序列:
*/
new Promise(function (resolve, reject) {
console.log(1111);
resolve(2222);
})
.then(function (value) {
console.log(value);
return 3333;
})
.then(function (value) {
console.log(value);
throw "An error"; // then 块默认会向下顺序执行,return 是不能中断的,可以通过 throw 来跳转至 catch 实现中断。
})
.catch(function (err) {
console.log(err);
}); //结果依次是1111 2222 3333 An error
/*
resolve() 中可以放置一个参数用于向下一个 then 传递一个值,
then 中的函数也可以返回一个值传递给 then。但是,
如果 then 中返回的是一个 Promise 对象,那么下一个 then 将相当于对这个返回的 Promise 进行操作,
这一点从刚才的计时器的例子中可以看出来。
reject() 参数中一般会传递一个异常给之后的 catch 函数用于处理异常。
*/
/*
但是请注意以下两点:
resolve 和 reject 的作用域只有起始函数,不包括 then 以及其他序列
resolve 和 reject 并不能够使起始函数停止运行,别忘了 return。
*/
//上述的 "计时器" 程序看上去比函数瀑布还要长,所以我们可以将它的核心部分写成一个 Promise 函数:
function print(delay, message) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log(message);
resolve();
}, delay);
});
}
print(1000, "First")
.then(function () {
return print(4000, "Second");
})
.then(function () {
print(3000, "Third");
});
//将代码变得更好看
async function asyncFunc() {
await print(1000, "First");
await print(4000, "Second");
await print(3000, "Third");
}
asyncFunc();
//异步函数 async function 中可以使用 await 指令,
//await 指令后必须跟着一个 Promise,
//异步函数会在这个 Promise 运行中暂停,直到其运行结束再继续运行。
Promise的使用
最新推荐文章于 2024-03-12 08:36:31 发布