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())。