在Node.js中从回调函数返回一个值

这个问题在这里已经有了答案:

  • 如何返回来自异步调用的响应? 33个答案

  • 它的undefined因为, console.log(response)doCall(urlToCall);之前运行doCall(urlToCall); 完成。 您还必须传递回调函数,该函数在请求完成时运行。

    首先,你的功能。 通过回调:

    function doCall(urlToCall, callback) {
        urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {                              
            var statusCode = response.statusCode;
            finalData = getResponseJson(statusCode, data.toString());
            return callback(finalData);
        });
    }
    

    现在:

    var urlToCall = "http://myUrlToCall";
    doCall(urlToCall, function(response){
        // Here you have access to your variable
        console.log(response);
    })
    

    @Rodrigo,在评论中张贴了一个很好的资源。 了解节点中的回调以及它们的工作方式。 请记住,它是异步代码。


    我在Node.js中从回调函数返回一个值时遇到了一些麻烦

    这不是一个“小麻烦”,实际上不可能从异步函数中“返回”传统意义上的值。

    既然你不能“返回值”,你必须调用一旦你有它的需要的值的函数。 @display_name已经回答了你的问题,但我只想指出,doCall中的返回并不是以传统方式返回值 。 您可以按如下方式编写doCall:

    function doCall(urlToCall, callback) {
        urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {                              
            var statusCode = response.statusCode;
            finalData = getResponseJson(statusCode, data.toString());
            // call the function that needs the value
            callback(finalData);
            // we are done
            return;
        });
    }
    

    线路callback(finalData); 是什么调用需要从异步函数获得的值的函数。 但请注意,return语句用于指示该函数在此处结束,但并不意味着该值将返回给调用方(调用方已经继续)。


    如果你想要的是让你的代码工作而不用修改太多。 你可以尝试这个解决方案,它可以摆脱回调保持相同的代码工作流程

    鉴于您正在使用Node.js,您可以使用co和co-request来实现相同的目标,而无需回调问题。

    基本上,你可以做这样的事情:

    function doCall(urlToCall) {
      return co(function *(){
        var response = yield urllib.request(urlToCall, { wd: 'nodejs' }); // This is co-request.                             
        var statusCode = response.statusCode;
        finalData = getResponseJson(statusCode, data.toString());
        return finalData;
      });
    }
    

    然后,

    var response = yield doCall(urlToCall); // "yield" garuantees the callback finished.
    console.log(response) // The response will not be undefined anymore.
    

    通过这样做,我们等待回调函数完成,然后从中获取值。 不知何故,它解决了你的问题。

    链接地址: http://www.djcxy.com/p/9473.html

    上一篇: Returning a value from callback function in Node.js

    下一篇: Loggin in users with Spotify account with the Spotify API