[英]Pass data back to anonymous function via callback?
我最近一直在研究JavaScript語言中的回調函數,並且在測試期間遇到了一個我沒有預見到的問題,但是一旦遇到它,我就知道該問題最有可能是什么。
我已經編寫了兩種方法,它們可以一起使用以調用Stack Exchange API進行學習。 第一個構建請求URL,第二個構建Web服務本身。
function getSEWebServiceResponse(request, callback) {
var apiRoot = 'https://api.stackexchange.com/2.2/';
var key = 'key=s29XM)Eqn2x3YxhjLgFwBQ((';
if (request.indexOf('?') >= 0)
key = '&' + key;
else
key = '?' + key;
getWebServiceResponse(apiRoot + request + key, callback);
}
function getWebServiceResponse(requestUrl, callback) {
var request = new XMLHttpRequest();
request.open('GET', requestUrl, true);
request.onload = function() {
if (request.status < 200 || request.status >= 400)
callback("An unexpected error occurred.");
else
callback(JSON.parse(this.response));
};
request.send();
}
現在,此實現很簡單,但是我遇到的問題是,將響應傳回導致undefined
,我相信原因是我使用匿名函數作為getSEWebServiceResponse
的回調:
function getAssociatedAccounts(accountID, callback) {
var url = 'users/' + accountID + '/associated';
getSEWebServiceResponse(url, function() {
if (!this.items) // this.items is undefined.
return;
var accounts = sortAccountsByReputation(this.items);
//... DO MORE STUFF
callback();
});
}
我相信簡單的解決方案是創建一個定義的函數(但是我認為應該有一種使用匿名函數的方法):
function getAssociatedAccounts(accountID, callback) {
var url = 'users/' + accountID + '/associated';
getSEWebServiceResponse(url, processAssociatedAccounts);
}
function processAssociatedAccounts(response) {
if (response.items)
return;
var accounts = sortAccountsByReputation(this.items);
//... DO MORE STUFF
callback();
}
一些不提供解決方案的相關文章:
有沒有一種方法可以將變量傳遞給匿名回調函數,而不是創建命名函數?
在原始的帶有匿名回調的getAssociatedAccounts
,您不接受響應參數。 將其更改為以下應該有效
function getAssociatedAccounts(accountID, callback) {
var url = 'users/' + accountID + '/associated';
getSEWebServiceResponse(url, function(response) { // accepted response as parameter
if (!response.items) // this.items is now response.items.
return;
var accounts = sortAccountsByReputation(response.items);
//... DO MORE STUFF
callback();
});
}
函數是命名的還是匿名的都沒有關系。 重要的是:
例如:
let counter = 1; function i_take_a_callback(callback) { callback(counter++); } function i_have_a_name(value) { console.log(`I have a name and am logging ${value}`); } i_take_a_callback(i_have_a_name); i_take_a_callback(function(value) { console.log(`I am anonymous and am logging ${value}`); });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.