nodejs:API差异fs.readFile与http.get

时间:2016-03-14 13:12:50

标签: javascript node.js q

Node.js没有内置的promises支持。最终的承诺实施取决于用户。 promise库Q支持一些帮助函数将节点样式(错误,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);

这已经是“某种”(!)承诺风格符号。 我问自己在node.js中是否存在这些不同API类型的原因。考虑到上面显示的例子,写下这样的东西会更加一致:

q.nfcall(http.get, "http://url..")
.then(succ_f)
.fail(err_f)
.done();

1 个答案:

答案 0 :(得分:1)

fs.readFile()使用公共节点回调习惯用法,其中调用回调,错误对象作为第一个参数(如果有错误),或者函数的结果(文件数据)作为第二个参数。

传递给http.get() 的可选函数(只有一个,而不是你建议的两个)是添加事件处理函数的快捷方式代表response事件。

换句话说,#1是#2的快捷方式:

// #1
var client = http.get(URL, function(res) { ... });

// #2
var client = http.get(URL);
client.on('response', function(res) { ... });

事件处理函数和"常规"回调是不同的野兽。事件处理程序通常用于流(http.get()返回流)。

流的错误可能在流的生命周期中的某个地方发生,因此您不要对流使用常规回调(这意味着一旦调用回调,就会发生任何错误)。此外,结果不一定立即可用(这需要读取流数据"手动")。

还有基于流的API文件(例如fs.createReadStream())。