【问题标题】:Accomplish Promise Chaining实现承诺链
【发布时间】:2017-01-17 15:16:41
【问题描述】:

背景

我有一个 nodejs 服务器正在运行,我安装了 promise 包,它跟在 promise api specs 之后。

自从我成功地使denodeify(fn, length) 工作以来,我现在正处于链接承诺的过程中,但我未能掌握主要概念。

我尝试了什么

通过阅读规范页面上的文档示例,我得到了以下代码:

let Promise = require("promise");
let write = Promise.denodeify(jsonfile.writeFile);
let read = Promise.denodeify(jsonfile.readFile);

read("dataFile.txt").then( () => {
    write("./testFile.txt", "hello_World", TABS_FORMATTING).then(console.log("file complete"));
});

这与我在Solutions Optimist tutorial 中看到的示例完全不同:

 loadDeparture( user )
        .then( loadFlight )
        .then( loadForecast );

目标

我的目标是让我的代码和我之前展示的示例一样漂亮,但我不明白如何才能做到现在这样简洁。

问题

1 - 我需要在代码中执行哪些更改才能达到该级别?

【问题讨论】:

    标签: javascript node.js promise chaining


    【解决方案1】:

    给定的示例使用命名函数使其看起来尽可能好,但这可能有点多余,因为您正在为链中的每一个小东西创建函数。您必须选择何时使用命名函数而不是匿名函数。

    您还必须意识到,要链接承诺,您必须返回它们。 因此,要使其成为正确的链,您必须返回 write 方法,以便将其传递到下一步。

    还要确保在每个 Promise 链的底部都使用了 catch() 方法,这样错误就不会被默默地吞没。

    请注意,在此处的示例中,我使用 ES2015 arrow functions 返回 write() 方法,因为这使它看起来更好(这似乎是您提出问题的目的)。

    let Promise = require("promise");
    let write = Promise.denodeify(jsonfile.writeFile);
    let read = Promise.denodeify(jsonfile.readFile);
    
    read("dataFile.txt")
        .then(() => write("./testFile.txt", "hello_World", TABS_FORMATTING))
        .then(results => console.log("file complete", results))
        .catch(error => console.error(err));
    

    我建议您阅读 this 文章了解一些最佳实践。

    【讨论】:

      【解决方案2】:

      嵌套 promise 有点违背目的,因为它创建了金字塔代码(就像回调一样)。

      您可能会忽略的主要概念是,您可以在then 中使用return,然后可以在链接的then 中访问返回的值(可以是承诺或值):

      read("dataFile.txt").then( () => {
          return write("./testFile.txt", "hello_World", TABS_FORMATTING);
      }).then( () => {
          console.log("file complete");
      });
      

      现在,您可以提取函数了:

      function writeTheFile() {
          return write("./testFile.txt", "hello_World", TABS_FORMATTING);
      }
      
      function consoleLog() {
          console.log("file complete");
      }
      
      read("dataFile.txt")
          .then(writeTheFile)
          .then(consoleLog);
      

      【讨论】:

        猜你喜欢
        • 2020-09-20
        • 2014-12-29
        • 2013-02-21
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 2015-01-06
        • 2012-07-17
        • 2015-11-08
        相关资源
        最近更新 更多