如何访问函数外部的回调内的局部变量

时间:2017-08-14 18:16:09

标签: javascript node.js variables callback

我正在使用npm plaid,我希望能够访问此variable trans之外的plaidClient.getTransactions。感谢

var trans;
 var startDate = moment().subtract(30, 'days').format('YYYY-MM-DD');
 var endDate = moment().format('YYYY-MM-DD');
 plaidClient.getTransactions(AccessToken, startDate, endDate, {
   count: 250,
   offset: 0,
 }, function(error, transactionsResponse) {
   if (error != null) {
    console.log(JSON.stringify(error));
    return response.json({
    error: error
    }); 
  }
  var trans = transactionsResponse
});

var trans //should work here

3 个答案:

答案 0 :(得分:0)

您对异步Javascript的工作方式存在根本性的误解。

我建议您阅读Javascript中执行异步流程的许多教程之一,以了解为什么这个问题是错误的。

快速谷歌搜索建议了很多关于这个主题的文章。

https://www.pluralsight.com/guides/front-end-javascript/introduction-to-asynchronous-javascript

答案 1 :(得分:0)

您无法使用异步代码执行此操作,更不用说同步代码了。您将永远无法访问在其定义的函数范围之外的变量trans

如果您想要访问trans代表函数trans所代表的值,则需要某种事件或流媒体。

尝试RxJS。

使用RxJS,您可以执行以下操作(未测试):

 var trans = Rx.Subject();

 var startDate = moment().subtract(30, 'days').format('YYYY-MM-DD');
 var endDate = moment().format('YYYY-MM-DD');
 plaidClient.getTransactions(AccessToken, startDate, endDate, {
   count: 250,
   offset: 0,
 }, function(error, transactionsResponse) {
   if (error != null) {
    console.log(JSON.stringify(error));
    return response.json({
    error: error
    }); 
  }

  // Pass the value into the stream.
  trans.next(transactionsResponse);
});

// Every time the `trans.next(...)` line is called in the HTTP call,
// this function will be invoked.
trans.asObservable().subscribe(function (transactionsResponse) {
  // use "transactionsResponse" how you please...
});

我们上面做的是创建一个名为trans的主题。当您的HTTP响应返回时,我们将值添加到trans主题流。在底部,我们订阅了该流,并且只要添加了某些内容,就会调用回调。通过这种方式,您始终拥有" access"你正在寻找trans,即使使用异步代码。

答案 2 :(得分:0)

您应该定义一个全局变量,即app,并使用它来保存您需要的访问变量。就像那样:

app = {};
//....

var startDate = moment().subtract(30, 'days').format('YYYY-MM-DD');
var endDate = moment().format('YYYY-MM-DD');

plaidClient.getTransactions(AccessToken, startDate, endDate, {
       count: 250,
       offset: 0
}, function(error, transactionsResponse) {
       if (error != null) {
          console.log(JSON.stringify(error));
          return response.json({
              error: error
          }); 
       }

       app.trans = transactionsResponse;
});

//....
console.log(app.trans); // should print correctly