我刚刚在MDN阅读了有关Promise的内容。我可以理解语法但不确定我们为什么需要它。
是否有特定情况只能通过使用Promise来完成?或者它只是一种编写清洁代码的方法?
答案 0 :(得分:6)
Promise让我们能够编写更清晰的代码,但减少(或完全删除)回调地狱。
此外,回调是ES2017中一些新语法功能的支柱,例如async functions
,它允许更清晰的编写代码的方式。
当你第一次学习语法 - 自动错误处理时,承诺所做的第三件事并不会立即显现出来。 Prom允许错误传递到链中并在一个公共位置处理,而不必进行手动错误处理。
答案 1 :(得分:3)
Promise对象用于执行异步函数。
从MDN文档的第一行开始:
Promise对象用于异步计算。 Promise表示尚未完成的单个异步操作,但预计将来会使用。
答案 2 :(得分:1)
答案 3 :(得分:0)
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
答案 4 :(得分:0)
目前,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
});