完成承诺链
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 - 我需要在我的代码中执行哪些更改才能达到该级别?
嵌套承诺有点违背了目的,因为它创建了金字塔代码(就像回调一样)。
您可能会忽略的主要概念是,您可以在 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);
给定的示例使用命名函数使其看起来尽可能好,但这可能有点多余,因为您要为链中的每个小东西创建函数。您必须选择何时使用命名函数而不是匿名函数。
您还必须意识到的一件事是,要链接承诺,您必须 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 文章以获得一些最佳实践。
背景
我有一个 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 - 我需要在我的代码中执行哪些更改才能达到该级别?
嵌套承诺有点违背了目的,因为它创建了金字塔代码(就像回调一样)。
您可能会忽略的主要概念是,您可以在 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);
给定的示例使用命名函数使其看起来尽可能好,但这可能有点多余,因为您要为链中的每个小东西创建函数。您必须选择何时使用命名函数而不是匿名函数。
您还必须意识到的一件事是,要链接承诺,您必须 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 文章以获得一些最佳实践。