我有这个功能:
exports.readPartial = function(html, values, response) {
fs.readFile(__dirname + "/../html/partials/" + html, function(error, file) {
if(error) { this.loadError(response, error); }
else {
console.log("\t--> partial found: " + file);
return file; // FILE VALUE
}
});
}
当调用该函数时,它应该返回“file”的值。但是,当调用return file;
时我实际上返回了作为参数传递的匿名函数中的值。
使用nodejs在异步编程上返回此值的正确方法是什么?
使用var that = this;
?
对这种编程风格感到困惑。
答案 0 :(得分:1)
您的readPartial
函数依赖于异步函数readFile
。所以它也是异步的。
现在您有几种方法可以解决此问题:
fs.readFile
的同步版本fs.readFileSync
(请参阅http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding)。然后你可以像往常一样返回结果。所以,基本上这意味着:两个函数都必须是异步的,或者两者都需要是同步的。
在这两个选项中,我更喜欢异步的选项也使用回调:这正是Node.js的核心竞争力 - 异步,非阻塞I / O.因此,如果您没有充分的理由反对它,请坚持使用异步版本并使用回调。
当然,您可能对其他选项存在感兴趣。所以,他们在这里(我不会推荐它):
fs.readFile
并“等待”其回调。这基本上意味着使用while(true)
循环进行主动等待,并且绝对被认为是不好的做法。无论如何,从技术上讲它是可行的。对于极少数情况下你真的想要这样做,或者你只是对如何实现这样的事情感兴趣,请查看syncasync.js。