Javascript 对异步函数的调用不能作为exptecd使用

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

我使用下面的代码,但是代码没有到达if语句

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()
需要返回一个承诺或接受一个回调,当结果可用时可以调用该回调。