Javascript TypeError:无法调用方法';然后';Nodejs承诺中未定义的
你能解释一下下面代码中的错误吗Javascript TypeError:无法调用方法';然后';Nodejs承诺中未定义的,javascript,node.js,file,callback,promise,Javascript,Node.js,File,Callback,Promise,你能解释一下下面代码中的错误吗 var promise = fs.readFile(file); var promise2 = promise.then(function(data){ var base64 = new Buffer(data, 'binary').toString('base64'); res.end("success"); }, function(err){ res.end("fail"); }); 它的抛出错误
var promise = fs.readFile(file);
var promise2 = promise.then(function(data){
var base64 = new Buffer(data, 'binary').toString('base64');
res.end("success");
}, function(err){
res.end("fail");
});
它的抛出错误为TypeError:无法调用未定义的方法“then”
不返回承诺。nodej基本上早于承诺的广泛使用,并且大多使用简单的回调
要读取文件,请传入一个简单的回调,如文档中的示例所示:
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});
有一种可用的方法可以将标准NodeJS模块包装到支持承诺的API中。其文档中的示例:
var promisify = require("promisify-node");
var fs = promisify("fs")
fs.readFile("/etc/passwd").then(function(contents) {
console.log(contents);
});
我应该强调的是,我不知道它,也没有使用过它,所以我不能说它的工作做得有多好。它似乎使用的是“带同步检查的基本承诺/a+实现”,而不是JavaScript的
承诺(这是公平的;它比JavaScript的承诺早几年)。您必须创建一个异步函数来返回承诺或使用类似的承诺库
香草JS
var promise = readFileAsync();
promise.then( function(result) {
// yay! I got the result.
}, function(error) {
// The promise was rejected with this error.
}
function readFileAsync()
{
var promise = new Promise.Promise();
fs.readFile( "somefile.txt", function( error, data ) {
if ( error ) {
promise.reject( error );
} else {
promise.resolve( data );
}
});
return promise;
}
与BlueBird.js一起使用
var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs"));
fs.readFileAsync("myfile.json").then(JSON.parse).then(function (json) {
console.log("Successful json");
}).catch(SyntaxError, function (e) {
console.error("file contains invalid json");
}).catch(Promise.OperationalError, function (e) {
console.error("unable to read file, because: ", e.message);
});
readFile
不返回承诺,为什么您认为它会返回?正如您所看到的,我正在尝试对文件进行base64加密,但我对承诺不熟悉。那么,处理这种情况的理想方法是什么呢?@Mithun您传入了一个回调,正如所描述的“但我对承诺是新的”,也许,但这里没有承诺。@Mithun:请看一看,如果您使用的是蓝鸟,您只需使用promsifyAll