2017-08-16 157 views
0

我在这里看到了很多帖子,展示了如何使用回调进行异步函数调用。我已经做到了,但是,我似乎无法找到如何在函数外部使用从函数中检索的变量。在异步函数调用之外使用变量

 var json = JSON.parse(body); 
     var accountID = json.accountId; 
     var getMatchData; 

     getRecentMatchData(accountID, function(err, res) { 
      getMatchData = res; 
      //console.log(res); 
     }); 
     console.log(getMatchData); 

我想使用getMatchData传递到我的app.post中的其他函数,但它打印出未定义。我如何访问此变量以在异步方法之外使用?我是否使用另一个回调?

+1

的[我如何返回从一个异步调用的响应?(可能的复制https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an - 异步调用) – cartant

+0

将* console.log(getMatchData)*放到异步函数调用的成功块中,或者将console.log放入函数中,然后在成功块上执行该函数。 至少这是我在做js filereader api时所做的。这就是我在我的ajax调用中所做的。 如果你试图在调用它后立即使用一个依赖于异步函数结果的变量,你总是会得到未定义的 – Merigold

+0

代码是异步的,你需要将'console.log(getMatchData)'移动到函数处理器中 –

回答

1

在这种情况下,你将不得不使用类似异步瀑布的东西。最后它意味着另一个回调。 您的示例代码示例是为了写出正确的重构,但这会有所帮助。

async.waterfall([ 
    function(callback) { 
     getRecentMatchData(accountID, function(err, res) { 
      callback(err, res); 
      getMatchData = res; 
      //console.log(res); 
     }) 
    }, 
    function(getMatchData, callback) { 
     // getMatchData now equals 'res' 
     // do what you have to do with getMatchData 
     callback(null, 'result'); 
    } 
], function (err, result) { 
    // result now equals 'result' 
}); 
+0

This看起来我只是最终做了中间块中的所有事情,这正是我在getRecentMatchData函数调用中所做的一切。听起来好像没有真正的方法让我在函数调用之外使用变量。最后一个函数只是错误检查,对吧? –

+0

最后一个函数是异步瀑布的回调。如果发生错误,它也会返回错误。 – Cleriston