gpt4 book ai didi

node.js - Promise with q 框架和 Node.js 中的回调模式?

转载 作者:搜寻专家 更新时间:2023-10-31 22:57:50 25 4
gpt4 key购买 nike

即使有据可查q framework如果您使用 Node.js 编程几天,则很难理解。但我喜欢了解它!

var Q  = require('q');
var fs = require('fs');

// Make the promise manually (returns a value or throws an error)
var read1 = fs.readFile(fname, enc, function (err, data) {
if(err) throw err;

return data;
});

// Convenient helper for node, equivalent to read1?
var read2 = Q.nfbind(fs.readFile);

// Uh?!
var read3 = function (fname, enc) {
var deferred = Q.defer();

fs.readFile(fname, enc, function (error, text) {
if (error) {
deferred.reject(new Error(error));
} else {
deferred.resolve(text);
}

return deferred.promise;
});
};


// Execute
Q.fncall(read1).then(function (data) {}, function (err) {}).done();

read1read2read3 是等价的吗?每次函数的最后一个参数接受 function (err, value) 样式的回调时,我都可以使用 Q.nfbind 吗?

最佳答案

您的示例中有一些错误。

阅读1

这不是“手动做出 promise ”,这只是一个普通的异步调用。在您的代码中,您立即调用了 readFile,因此 read1 将是 readFile 的返回值,即 undefined。要获得类似于 read2read3 的行为,您需要执行如下操作:

var read1 = function(fname, env, success, error){
fs.readFile(fname, enc, function (err, data) {
// Throwing here would just crash your application.
if(err) error(err);

// Returning from inside 'readFile' does nothing, instead you use a callback.
else success(data);
});
};

阅读2

// Not equivalent to read1 because of the notes above,
// Equivalent to read3, with the fixes I mention below.
var read2 = Q.nfbind(fs.readFile);

阅读3

var read3 = function (fname, enc) {
var deferred = Q.defer();

fs.readFile(fname, enc, function (error, text) {
if (error) {
// 'error' is already an error object, you don't need 'new Error()'.
deferred.reject(error);
} else {
deferred.resolve(text);
}

// HERE: Again returning a value from 'readFile' does not make sense.
return deferred.promise;
});

// INSTEAD: Return here, so you can access the promise when you call 'read3'.
return deferred.promise.
};

您确实可以在任何将回调作为最后一个参数的对象上使用nfbind。根据我的评论,read2read3 实现了相同的目标,即创建一个函数,该函数将采用文件名和编码,并返回一个 promise 对象。

对于那些,你可以这样做:

read2('file.txt', 'utf8').then(function (data) {}, function (err) {}).done();
read3('file.txt', 'utf8').then(function (data) {}, function (err) {}).done();

对于read1,你可以这样调用它:

read1('file.txt', 'utf8', function (data) {}, function (err) {});

更新

自从回答了这个问题后,标准 promise 发生了一些变化,如果您倾向于 read3,我建议您执行以下操作:

var read4 = function (fname, enc) {
return Q.promise(function(resolve, reject){
fs.readFile(fname, enc, function (error, text) {
if (error) {
// 'error' is already an error object, you don't need 'new Error()'.
reject(error);
} else {
resolve(text);
}
});
});
};

这更符合标准 ES6 promise 和 bluebird,因此您可以更轻松地推进代码。使用 read3 中提到的方法还引入了同步抛出异常的可能性,而不是在 promise 链中捕获它们,这通常是不可取的。参见 the deferred antipattern .

关于node.js - Promise with q 框架和 Node.js 中的回调模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14978630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com