当前位置: 首页 > 知识库问答 >
问题:

为什么我们使用promise而不是if/then语句?

尉迟京
2023-03-14

我正在学习亚当·简斯的合唱团教程。

数据是用这个代码块加载的

var promises = [
  d3.json("https://d3js.org/us-10m.v1.json"),
  d3.tsv("unemployment.tsv", function(d) { unemployment.set(d.id, +d.rate); })
]

Promise.all(promises).then(ready)

而准备就绪被定义

function ready([us]) {
  svg.append("g")
      .attr("class", "counties")
    .selectAll("path")
    .data(topojson.feature(us, us.objects.counties).features)
    .enter().append("path")
      .attr("fill", function(d) { return color(d.rate = unemployment.get(d.id)); })
      .attr("d", path)
    .append("title")
      .text(function(d) { return d.rate + "%"; });

  svg.append("path")
      .datum(topojson.mesh(us, us.objects.states, function(a, b) { return a !== b; }))
      .attr("class", "states")
      .attr("d", path);
}

我把这个序列理解为

首先-创建一个名为promises的数组,其中第一项是来自此链接的已解析json,第二项是来自该文件的id/值对的映射

第二,获取promise变量中的所有promise,如果成功,则触发函数ready,如果失败,则不执行任何操作

如果这是对的,那么相对于这样的东西有什么优势呢?我用伪代码写这个因为我是新手

var promises = [
  d3.json("https://d3js.org/us-10m.v1.json"),
  d3.tsv("unemployment.tsv", function(d) { unemployment.set(d.id, +d.rate); })
]

if(promises == 'SUCCESS'){ function(ready) };

请注意,我读到了一些promise及其优势,因为javascript是单线程的。我问这个问题,因为我并不觉得发生了任何异步事件,所以在这两种情况下,代码都必须加载promises数组。

共有2个答案

充煌
2023-03-14

我并不认为发生了任何异步事件

你错了。d3.jsond3.tsv都是异步调用,它们从网络上加载文件。

制作一个数组,其中第一项是已解析的json,第二项是映射

不会。这些呼叫返回的是promise,而不是立即可用且可以同步检查其成功的结果。您可能需要更新有关Promise对象表示什么的知识。

方鸿羲
2023-03-14

d3.json()d3.tsv()都是异步网络调用;这些promise将在调用完成时解决。您的伪代码不起作用,因为if将在异步调用完成后立即运行,而不是在它们完成后运行。

promise是一种表达“做这件事需要一段时间,然后当它完成时,用它的结果做一些事情”的方式。(正如评论中指出的,这是一个简化的定义,但可能已经足够开始了。)同步版本是“做这件事需要一段时间,然后立即尝试用结果做一些事情(还没有到达)。”

Promise.all(promises).then(ready);

在本例中,您实际上将promise包装在另一个promise中——两个d3调用都是一个promise,然后promise。all()将另一个promise包装在这两个promise周围,它将等待两个内部promise都完成后再触发其then()

这与javascript是单线程的无关;它只是改变了事件的顺序。澄清:

console.log("Before promises");
Promise.all(promises).then(function() {
   console.log("Promises have resolved");
});
console.log("After promises");

将导致此输出:

> Before promises
> After promises
> Promises have resolved
 类似资料:
  • 问题内容: 我一直习惯使用if,else-if语句,而不是多个if语句。 例: 与示例2相比如何? 我知道功能上它们是相同的。但是,如果不是,则是否是最佳做法?当我指出他可以不同地构造代码库以使其更整洁时,它是由我的一位朋友提出的。对我来说这已经是一种习惯,但是我从来没有问过为什么。 问题答案: 一旦找到正确的语句,它们就会停止进行比较。做每个比较。第一个是更有效的。 编辑: 在注释中已指出您在每

  • 问题内容: 我正在阅读Java JDBC规范(版本4),并且遇到了以下语句: DataSource-此接口在JDBC 2.0可选软件包API中引入。它优于DriverManager,因为它允许有关基础数据源的详细信息对应用程序透明 我想了解的是a 和a 之间的区别以及它为什么存在。我的意思是,上面的代码块说关于数据源的详细信息对于应用程序是透明的,但是是否不会在属性文件中外部化数据库属性(例如用户

  • 我试图理解的是和之间的区别,以及它存在的原因。我的意思是,上面的块表明关于数据源的细节对应用程序是透明的,但是在属性文件中外部化数据库属性如用户名、密码、url等,然后使用DriverManager是否会以同样的方式工作? 创建接口是否只是为了有一种返回可以池化的连接的通用方式?在Java EE中,应用程序服务器是否实现了这个接口,并且部署的应用程序是否具有对数据源的引用而不是连接?

  • 我想知道为什么人们似乎不使用GraphQL jus与Redux。 我以前从未使用过GraphQL,但我想开始一个新项目,但阿波罗和继电器都不能说服我。目前,我正在创建一个使用react和redux以及“老式”RESTAPI的应用程序。我喜欢redux的想法,它将我的应用程序的全部信息存储在一个地方。 现在,据我所知,阿波罗和中继都做了类似的事情,但它们使用单独的存储,在这两者中,我们混合了逻辑和视

  • 问题内容: 我是Java的新手,正在尝试学习速记语句的概念。 我想出了下面的代码。但是,该代码将无法编译,并在(即?:)语句旁边显示错误。 有人可以告诉我为什么它不起作用吗? 对不起,如果我的问题对某些人听起来很愚蠢。我是Java新手。 在此先感谢您的帮助! 问题答案: 三元表达 是一个 表达式 ,而不是一个语句,因此不能在需要语句的地方使用。 您可以这样写: 因为这是一个声明。

  • 问题内容: 我的代码: 当我尝试运行这样的东西时: 我越来越: 但为什么? 我的主要目标是将令牌(从令牌中返回承诺)转换为变量。然后才执行一些操作。 问题答案: 只要其结果尚未解决,promise将始终记录未决。无论promise状态如何(已解决或仍处于待处理状态),您都必须调用promise来捕获结果: 这是为什么? 承诺只是向前的方向;您只能解决一次。a的解析值传递给其或方法。 根据Promi