我刚刚在MDN上读到了 Promise,我理解了语法,但不确定为什么需要它。
有没有一些特定的情况只能使用 Promise 来完成?还是说它只是一种更简洁的代码编写方式?
我刚刚在MDN上读到了 Promise,我理解了语法,但不确定为什么需要它。
有没有一些特定的情况只能使用 Promise 来完成?还是说它只是一种更简洁的代码编写方式?
目前来说,使用JavaScript promises无法完成任何原本不能通过其它方式实现的功能,因为Promise最初的实现也是由JavaScript代码编写的。使用Promise的优点之一在于摆脱了所谓的“回调地狱”,它看起来像这样:
setTimeout(function () {
setTimeout(function() {
setTimeout(function() {
// do something
});
});
});
通过为函数命名,可以轻松解决这个问题:
setTimeout(doSomething);
function doSomething() {
setTimeout(doSomethingElse);
}
function doSomethingElse() {
// do something
}
samplePromise().then(function () {
samplePromise().then(function () {
samplePromise().then( function () {
// do something
});
});
});
看到规律了吗?我们再次发现匿名函数是深层嵌套的罪魁祸首。
话虽如此,有一种情况可能可以从Promise中获益,那就是当来自多个异步调用的异常可以被同一个catch块捕获时:
new Promise(function (resolve, reject) {
resolve("Blah");
}).then(function () {
// do something
}).then(function () {
// do something
}).catch(function (reason) {
// error handling
});
Promise对象用于执行异步函数。
从MDN文档的第一行开始:
Promise对象用于异步计算。Promise表示尚未完成但预计将来会完成的单个异步操作。
这只是为了编写更清晰的代码。看看这个例子:
https://www.npmjs.com/package/q
它说:function dieToss() {
return Math.floor(Math.random() * 6) + 1;
}
console.log('1');
var promise = new RSVP.Promise(function(fulfill, reject) {
var n = dieToss();
if (n === 6) {
fulfill(n);
} else {
reject(n);
}
console.log('2');
});
promise.then(function(toss) {
console.log('Yay, threw a ' + toss + '.');
}, function(toss) {
console.log('Oh, noes, threw a ' + toss + '.');
});
console.log('3');
这个例子说明了两件事:
首先,我们附加到 Promise 的处理程序确实在所有其他代码异步运行后被调用。
其次,只有当 Promise 被履行时,才会调用履行处理程序,并使用它解决的值(在我们的情况下,是掷骰子的结果)。拒绝处理程序也是如此。
感谢 Mozilla 和 Toptotal。