Promise是ES6中为解决“回调地狱”等问题而给出的优雅解决方案。刚接触时,非常不容易理解。最近看到一篇国外的博客,以讲故事的形式,通俗易懂地讲解Promise,在此推荐给大家。故事概要:妈妈答应下周为你买一部新手机。如果妈妈的承诺兑现了,你就把新手机展示给别人看。言为之意,如果妈妈改变主意了,那就不展示了。
//ES6
const isMomHappy = true;
// 1st Promise
const willGetNewPhone = new Promise((resolve, reject) => {
if (isMomHappy) {
const phone = {
brand: 'Samsung',
color: 'black'
};
resolve(phone); // fulfilled
} else {
const reason = new Error('mom is not happy');
reject(reason); // reject
}
});
// 2nd Promise
const showOff = function(phone) {
return new Promise((resolve, reject) => {
const message = 'Hey friend, I have a new ' +
phone.color + ' ' + phone.brand + ' phone';
resolve(message);
});
};
// 等价于 2nd Promise
var showOff02 = function(phone) {
const message = 'Hey friend, I have a new ' +
phone.color + ' ' + phone.brand + ' phone';
return Promise.resolve(message);
};
// call our promise
const askMom = function() {
willGetNewPhone
.then(showOff) // chain it here
.then(fulfilled => console.log(fulfilled))
.catch(error => console.log(error.message))
};
askMom();
这里以“妈妈高兴”表示异步调用成功,“妈妈不高兴”表示失败。
直接使用构造函数定义第一个Promise对象。对于resolve(phone),可以理解为:本次异步操作成功了,并把成功的喜悦传递给下游的Promise。对于reject(reason),可以理解为:本次异步操作失败了,并把失败原因传递给下游。
使用匿名函数包裹Promise对象。该Promise很乐观,如果上游传来成功的消息,他就把消息加工一下再次传递给下游。如果失败了什么也不做,直接传递给下游。showOff02是一种等价的写法。
把这些Promise像糖葫芦一样串起来。fulfilled => console.log(fulfilled),使用了箭头函数定义了一个Promise,如果成功了,就打印成功的消息。这里的成功和单词fulfilled没有半毛钱关系,这里只有一个参数,而Promise构造函数的第一个参数表示成功。如果失败了什么也不做,直接传递给下游。
.catch(…)捕获上游传递下来的Error或者失败(reject),这和Java里的catch有些差别,后者捕获检查异常或运行期异常。从error.message可以看出,这里打印的是Error信息。
这串糖葫芦的味道就是:
如果妈妈为我买了新手机,把成功的消息,即手机品牌、颜色,传递给下游;
上游传来了成功的消息,加工一条字符串,并作为成功的消息传递给下游;
上游传来了成功的消息,打印消息。把成功传递给下游,无成功的消息;
上游没有失败的消息和异常消息,保持沉默;
结束。
资料:https://scotch.io/tutorials/javascript-promises-for-dummies
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17321.html