promise的基本概念和用法
- 什么是promise?
promise(承诺)包含三种状态pending(待定),resolved(已解决的),rejected(拒绝的)
- 创建一个promise
let haveMoney = false; // 草,我没有钱
let willBuyHome = new Promise((resolve, reject) => {
if (haveMoney) {
let home = {
color = 'yellow',
length = 2000
};
resolve(home)
} else {
let reason = new Error('老子不开心呢')
reject(reason)
}
})
new Promise(function(resolve, reject) { ... }) // 大概语法
总结一下:当结果正确的时候,调用resovle方法,错误异常情况调用reject方法。
-
promise函数的使用
/* ES5 */ var askMe = function () { willBuyHome .then(function (fulfilled) { // 有钱 console.log(fulfilled); }) .catch(function (error) { // 缺钱 console.log(error.message); }); }; askMe(); // 调用函数
我们用promise实例的.then和.catch方法来处理Promise中resovled和rejected
-
promise 的串联
我们可以用Promise.resolve(param)和Promise.reject(param)来简化上面的写法
let requestInfo = (home) => { let message = `这座房子的颜色${home.color},这座房子长度为${home.length}`; return Promise.resolve(message) }
看一下两个promise是如何实现串联的
let combainaFun = () { willBuyHome .then(requestInfo) // 传入第二个函数,串联 .then((mes) => { console.log(msg) // output: '这座房子的颜色yellow,这座房子的长度为2000' .catch((error) => { console.log(error) // output error }) }) }
-
es7看着更舒服的异步写法
async function combainaFun() {
try {
let home = await willBuyHome();
let message = await requestInfo(home); // 第一步结果赋值给第二个异步函数,体现了
// 同步写法。
console.log(message)
} catch (error) {
console.log(error.message || '服务器有点忙')
}
}
-
用promise的原因
promise帮我们解决了异步程序中,回调函数必须作为参数(俗称的回调地狱问题),逻辑更清晰