为什么我们需要JS中的Promise

时间:2016-08-17 19:15:29

标签: javascript

我刚刚在MDN阅读了有关Promise的内容。我可以理解语法但不确定我们为什么需要它。

是否有特定情况只能通过使用Promise来完成?或者它只是一种编写清洁代码的方法?

5 个答案:

答案 0 :(得分:6)

Promise让我们能够编写更清晰的代码,但减少(或完全删除)回调地狱。

此外,回调是ES2017中一些新语法功能的支柱,例如async functions,它允许更清晰的编写代码的方式。

当你第一次学习语法 - 自动错误处理时,承诺所做的第三件事并不会立即显现出来。 Prom允许错误传递到链中并在一个公共位置处理,而不必进行手动错误处理。

答案 1 :(得分:3)

Promise对象用于执行异步函数。

从MDN文档的第一行开始:

  

Promise对象用于异步计算。 Promise表示尚未完成的单个异步操作,但预计将来会使用。

答案 2 :(得分:1)

这只是为了写清洁代码。看看这个:

https://www.npmjs.com/package/q

它说:

  

在第一次通过时,承诺可以缓解“毁灭金字塔”:代码向右前进的速度比前进的速度快。

答案 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
});