2017-08-14 86 views
0

即時通訊使用npm plaid我希望能夠訪問此plaidClient.getTransactions以外的variable trans。由於如何訪問回調內的局部變量功能外

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

+0

這可能會幫助你[鏈接](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call ) –

+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主題流中。最後,我們訂閱該流,任何時候都會添加一些內容,回調將被調用。通過這種方式,即使使用異步代碼,您也始終擁有要查找的「訪問」。

+0

使用另一個lib使整件事情變得不容易。使用承諾或異步/等待 –

+0

沒錯,但他已經在使用Vanilla JS,這意味着默認情況下承諾/異步/等待不會內置(或至少廣泛支持)。這意味着他必須爲這些人添加polyfills,並且/或者學習如何使用它們,這與採用RxJS方法沒有多大區別。 – Lansana

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