是否有特定的功能只能通过 JS 中的 Promise 来完成?

问题描述 投票:0回答:7

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

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

javascript promise
7个回答
11
投票

Promise 使我们能够通过减少(或完全消除)回调地狱来编写更干净的代码。

此外,回调是 ES2017 中出现的一些新语法功能的支柱,例如

async functions
,它允许以更简洁的方式编写代码。

当你第一次学习语法时,Promise 所做的第三件事并不是立即显而易见的——自动错误处理。 Promise 允许错误沿着链传递并在一个公共位置进行处理,而无需进行多层手动错误处理。


7
投票

目前,没有任何事情可以用 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
});

1
投票

Promise 对象用于执行异步功能。

来自 MDN 文档的第一行:

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


0
投票

这只是为了编写更清晰的代码。看看这个:

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

它说:

在第一遍中,Promise 可以缓解“末日金字塔”:代码向右行进的速度比向前行进的速度快的情况。


-1
投票

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


-1
投票

我们使用 Promise 来摆脱:-

  1. 回调地狱(末日金字塔):- 这个问题将在 Promise Chaining 的帮助下解决

  2. 控制反转:- 这个问题将在 Promise 的帮助下得到解决。


-2
投票

我发现 Promise 的唯一用例是

设置超时 或者 获取 api 调用

或者正如其他人提到的阅读文件。

在 Promise 中实际上无法完成任何异步操作。甚至不使用 Web Worker 来执行带有 Promise 的异步操作。它是如此令人困惑,因为实际上 Promise 根本没有用处。想知道为什么/谁创造了它。

© www.soinside.com 2019 - 2024. All rights reserved.