簡體   English   中英

通過回調將數據傳遞回匿名函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM