我刚刚在 MDN 上阅读了有关 Promise 的内容。我可以理解语法,但不确定为什么我们需要它。
是否有特定情况只能使用 Promise 来完成?或者这只是编写更简洁代码的一种方法?
Promise 使我们能够通过减少(或完全消除)回调地狱来编写更干净的代码。
此外,回调是 ES2017 中出现的一些新语法功能的支柱,例如
async functions
,它允许以更简洁的方式编写代码。
当你第一次学习语法时,Promise 所做的第三件事并不是立即显而易见的——自动错误处理。 Promise 允许错误沿着链传递并在一个公共位置进行处理,而无需进行多层手动错误处理。
目前,没有任何事情可以用 JavaScript Promise 完成,而没有它们就不能完成,因为最初的 Promise 实现也是 JavaScript 代码。使用 Promise 的理由之一是摆脱所谓的“回调地狱”,它看起来像这样:
setTimeout(function () {
setTimeout(function() {
setTimeout(function() {
// do something
});
});
});
这可以通过简单地给函数命名来轻松解决:
setTimeout(doSomething);
function doSomething() {
setTimeout(doSomethingElse);
}
function doSomethingElse() {
// do something
}
所以“回调地狱”是一个误解,真正的问题应该称为“匿名函数地狱”。顺便说一句,仅使用 Promise 也无法阻止这种情况,如以下示例所示:
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
它说:
在第一遍中,Promise 可以缓解“末日金字塔”:代码向右行进的速度比向前行进的速度快的情况。
Promise 对象用于异步计算。一个承诺 表示尚未完成的单个异步操作, 但预计在未来。
这是一个例子。你可以在这里运行它http://jsbin.com/yumapi/5/edit?html,js,output
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 的处理程序确实是在所有其他代码异步运行后调用的。
其次,只有当承诺得到履行时,才会调用履行处理程序,并使用其解决的值(在我们的例子中,是掷骰子的结果)。对于拒绝处理程序来说也是如此。
感谢 Mozilla 和 Toptotal
我们使用 Promise 来摆脱:-
回调地狱(末日金字塔):- 这个问题将在 Promise Chaining 的帮助下解决
控制反转:- 这个问题将在 Promise 的帮助下得到解决。
我发现 Promise 的唯一用例是
设置超时 或者 获取 api 调用
或者正如其他人提到的阅读文件。
在 Promise 中实际上无法完成任何异步操作。甚至不使用 Web Worker 来执行带有 Promise 的异步操作。它是如此令人困惑,因为实际上 Promise 根本没有用处。想知道为什么/谁创造了它。