Javascript 对异步函数的调用不能作为exptecd使用
我使用下面的代码,但是代码没有到达if语句Javascript 对异步函数的调用不能作为exptecd使用,javascript,asynchronous,callback,promise,bluebird,Javascript,Asynchronous,Callback,Promise,Bluebird,我使用下面的代码,但是代码没有到达if语句 function getContent(key) { var filePath = path.join(__dirname, '../test.txt'); fs.readFile(filePath, 'utf8', function (err, data) { if (err) { return console.log(err); } .... v
function getContent(key) {
var filePath = path.join(__dirname, '../test.txt');
fs.readFile(filePath, 'utf8', function (err, data) {
if (err) {
return console.log(err);
}
....
var fileKeyValObj = {};
return fileKeyValObj[key];
});
}
我能够通过调试访问上一个方法的返回,并且其工作正常。。。
此处函数未到达if
getContent('web', function (cmd) {
if (typeof cmd !== 'undefined') {
这里的关键是我发送的web,我看到getContent的返回值是正确的
我看到了这篇文章,但我想我也这么做了,我错过了什么吗?
顺便说一句,在这种情况下,建议像blue bird一样使用promise???问题在于
fs回调中的返回值。readfile
不是其包含函数getContent
的有效返回值
当您将回调传递给fs.readFile
时,您传入的函数将排队等待fs.readFile
完成时运行。简单来说,getContent
进行排队,然后说“我的作业完成了!”并返回(void),但是fs.readfile
在运行回调之前正在等待自己完成
当fs.readfile
运行其回调时,它不在getContent
的上下文中。它将返回,但“没有人会在那里”来获取返回值
您可以做的是将回调传递到getContent
,然后将其传递到fs.readFile
function getContent(key, callback) {
var filePath = path.join(__dirname, '../test.txt');
fs.readFile(filePath, 'utf8', callback);
}
getContent('web', function (error, data) {
if (!error) {
... //Put your code here!
} else {
console.log(error);
}
});
现在,getContent
将在fs.readFile
完成时运行其第二个参数函数(错误,数据)
。问题是fs.readFile
的回调中的返回值不是其包含函数getContent
的有效返回值
当您将回调传递给fs.readFile
时,您传入的函数将排队等待fs.readFile
完成时运行。简单来说,getContent
进行排队,然后说“我的作业完成了!”并返回(void),但是fs.readfile
在运行回调之前正在等待自己完成
当fs.readfile
运行其回调时,它不在getContent
的上下文中。它将返回,但“没有人会在那里”来获取返回值
您可以做的是将回调传递到getContent
,然后将其传递到fs.readFile
function getContent(key, callback) {
var filePath = path.join(__dirname, '../test.txt');
fs.readFile(filePath, 'utf8', callback);
}
getContent('web', function (error, data) {
if (!error) {
... //Put your code here!
} else {
console.log(error);
}
});
现在,当fs.readFile
完成时,getContent
将运行其第二个参数函数(错误,数据)
。谢谢,但是在readFile之后,我应该使用额外的逻辑,我应该把它放在哪里?好的,那么在这种情况下我应该把什么放在回调中?@JhonDree:你应该把回调
调用放在你当前放置return
语句的地方。@Bergi-有点困惑,你能举个例子吗?如果您能更好地帮助promise…当我调用getContent
时,我会传入两个参数:web
,和函数(错误、数据)…
。第二个参数成为getContent
函数参数中的callback
。然后,我们将相同的函数传递到fs.readFile
的第二个参数callback
。谢谢,但是在readFile之后,我应该使用额外的逻辑,我应该把它放在哪里?好的,那么在这种情况下我应该把什么放在回调中?@JhonDree:你应该把回调
调用放在你当前放置return
语句的地方。@Bergi-有点困惑,你能举个例子吗?如果您能更好地帮助promise…当我调用getContent
时,我会传入两个参数:web
,和函数(错误、数据)…
。第二个参数成为getContent
函数参数中的callback
。然后,我们将同一个函数传递到fs.readFile
的第二个参数callback
。从异步回调返回数据并不是您想要的。这只是返回到文件系统代码的内部,而不是返回到您的任何代码。您不能尝试使异步操作突然同步。你就是不能getContent()
需要返回一个承诺或接受一个回调,当结果可用时,您可以调用该回调。从异步回调返回数据并不是您想要的。这只是返回到文件系统代码的内部,而不是返回到您的任何代码。您不能尝试使异步操作突然同步。你就是不能getContent()
需要返回一个承诺或接受一个回调,当结果可用时可以调用该回调。