我运行了一个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 - 我需要在代码中执行哪些更改才能达到该级别?
答案 0 :(得分:1)
嵌套承诺会破坏目的,因为它会创建金字塔代码(就像回调一样)。
可能逃避您的主要概念是您可以在return
内then
,然后可以在链接{{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文章,了解最佳做法。