nodejs:API 差异 fs.readFile 与 http.get
nodejs: API differences fs.readFile vs. http.get
Node.js 没有内置的承诺支持。最终的承诺实现取决于用户。 promise 库 Q 支持一些辅助函数来将节点式 (err, succ) 函数转换为 promise 对象。
q 文档用 fs.readFile 函数显示了这一点,如下所示:
var fs = require("fs");
var q = require("q");
q.nfcall(fs.readFile, "/path/file")
.then(_ => console.log("succ"))
.fail(_ => console.log("err"))
.done();
这很好用。然而,将此结构转移到 http.get 函数是不可能的,因为它本身具有另一个结构:
var http = require("http");
http.get("http://url..", succ_funct).on("error", err_funct);
这已经是 "sort of" (!) 承诺风格的表示法。
我在问自己 node.js 中那些不同的 API 类型是否有原因。考虑到上面显示的示例,这样写会更一致:
q.nfcall(http.get, "http://url..")
.then(succ_f)
.fail(err_f)
.done();
fs.readFile()
使用常见的 Node 回调习惯用法,其中调用回调时将错误对象作为第一个参数(如果有错误),或者将函数的结果(文件数据)作为第二个参数。
传递给 http.get()
的可选函数 (只有一个,而不是你建议的两个) 是添加 的快捷方式response
事件的事件处理函数。
换句话说,#1是#2的快捷方式:
// #1
var client = http.get(URL, function(res) { ... });
// #2
var client = http.get(URL);
client.on('response', function(res) { ... });
事件处理函数和 "regular" 回调是不同的东西。事件处理程序通常用于流(http.get()
returns 一个流)。
流的错误可能会在流的生命周期中的某个地方发生,因此您不要对流使用常规回调(这意味着一旦回调被调用,任何错误都已经发生)。此外,结果不一定立即可用(这需要读取流数据"manually")。
还有基于流的 API 文件(如 fs.createReadStream()
)。
Node.js 没有内置的承诺支持。最终的承诺实现取决于用户。 promise 库 Q 支持一些辅助函数来将节点式 (err, succ) 函数转换为 promise 对象。
q 文档用 fs.readFile 函数显示了这一点,如下所示:
var fs = require("fs");
var q = require("q");
q.nfcall(fs.readFile, "/path/file")
.then(_ => console.log("succ"))
.fail(_ => console.log("err"))
.done();
这很好用。然而,将此结构转移到 http.get 函数是不可能的,因为它本身具有另一个结构:
var http = require("http");
http.get("http://url..", succ_funct).on("error", err_funct);
这已经是 "sort of" (!) 承诺风格的表示法。 我在问自己 node.js 中那些不同的 API 类型是否有原因。考虑到上面显示的示例,这样写会更一致:
q.nfcall(http.get, "http://url..")
.then(succ_f)
.fail(err_f)
.done();
fs.readFile()
使用常见的 Node 回调习惯用法,其中调用回调时将错误对象作为第一个参数(如果有错误),或者将函数的结果(文件数据)作为第二个参数。
传递给 http.get()
的可选函数 (只有一个,而不是你建议的两个) 是添加 的快捷方式response
事件的事件处理函数。
换句话说,#1是#2的快捷方式:
// #1
var client = http.get(URL, function(res) { ... });
// #2
var client = http.get(URL);
client.on('response', function(res) { ... });
事件处理函数和 "regular" 回调是不同的东西。事件处理程序通常用于流(http.get()
returns 一个流)。
流的错误可能会在流的生命周期中的某个地方发生,因此您不要对流使用常规回调(这意味着一旦回调被调用,任何错误都已经发生)。此外,结果不一定立即可用(这需要读取流数据"manually")。
还有基于流的 API 文件(如 fs.createReadStream()
)。