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();
答案 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()
)。