node.js传递一个回调?

时间:2016-02-03 21:47:00

标签: javascript node.js

目前正在工作:

function getAccessToken ( callback ) {

    request({
        uri: oauth2_url,
        method: 'POST',
        form: { 
            grant_type: 'password', 
            client_id: client_id, 
            client_secret: client_secret,   
            username: username, 
            password: password 

        }
    }, 
    function tokenRequestResponse (error, response) { 

        if ( !error && response.statusCode == 200) { 
            // Send our data back to caller.
            callback ( JSON.parse(response.body).access_token );
        }
        else { 
            console.log('Error: ' + response.statusCode); 
        }

    });
}

我想要完成的事情:

function tokenRequestResponse (error, response) { 

        if ( !error && response.statusCode == 200) { 

            callback ( JSON.parse(response.body).access_token );
        }
        else { 
            console.log('Error: ' + response.statusCode); 
        }

}

function getAccessToken ( callback ) {

    request({
        uri: oauth2_url,
        method: 'POST',
        form: { 
            grant_type: 'password', 
            client_id: client_id, 
            client_secret: client_secret,   
            username: username, 
            password: password 

        }
    }, tokenRequestResponse });

}

我想避免嵌套tokenRequestResponse(),除非这是让它与回调一起使用的唯一方法。

它应该:

  • 创建请求
  • 收到回复后,请检查错误。
  • 如果未找到错误,请将数据发送回getAccessToken()的调用方。

这更像是一个学习Node.js异步问题,我尝试了一些事情,并且认为我会问一些专家。

1 个答案:

答案 0 :(得分:5)

解决此问题的最常用方法是返回一个关闭callback

的函数

这样的事情:

function tokenRequestResponse(callback) {
    return function (error, response) { 

        if ( !error && response.statusCode == 200) { 

            callback ( JSON.parse(response.body).access_token );
        }
        else { 
            console.log('Error: ' + response.statusCode); 
        }
    }
}

然后你可以像这样使用它:

function getAccessToken ( callback ) {

    request({
        uri: oauth2_url,
        method: 'POST',
        form: { 
            grant_type: 'password', 
            client_id: client_id, 
            client_secret: client_secret,   
            username: username, 
            password: password 

        }
    }, tokenRequestResponse(callback));
}

当您调用tokenRequestResponse(callback)时,该函数返回一个将用于request回调的函数。