繁体   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