完成承诺链

时间:2017-01-17 15:16:42

标签: javascript node.js promise chaining

背景

我运行了一个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 - 我需要在代码中执行哪些更改才能达到该级别?

2 个答案:

答案 0 :(得分:1)

嵌套承诺会破坏目的,因为它会创建金字塔代码(就像回调一样)。

可能逃避您的主要概念是您可以在returnthen,然后可以在链接{{1}中访问返回的值(可以是承诺或值) }}:

then

现在,您可以提取功能:

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

答案 1 :(得分: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文章,了解最佳做法。