完成承诺链

Accomplish Promise Chaining

背景

我有一个 nodejs 服务器 运行 我安装了 promise package which follows the 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 );

Objective

我的objective是为了让我的代码像我之前展示的例子一样漂亮,但我不明白我是如何做到像现在这样简洁的。

问题

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

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

您可能会忽略的主要概念是,您可以在 thenreturn,然后可以在链式 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);

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

您还必须意识到的一件事是,要链接承诺,您必须 return 它们。 因此,要使其成为正确的链,您必须 return 写入方法,以便将其传递到下一步。

还要确保在每个 promise 链的底部使用 catch() 方法,这样错误就不会悄无声息地被吞没。

请注意,在此处的示例中,我使用了 ES2015 arrow functions 到 return 的 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 文章以获得一些最佳实践。