如何使用 async.series node.js 将 request.get 的值传递给回调

How to pass the value of the request.get to the callback using async.series node.js

我想展示我的代码:

    request({url: API_URL}, function (error, response, body) {

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

        console.log("Items received with success.");
        var data = JSON.parse(body);

        // catch duration from video
        for(var list in data) {
            var item = data[list];

            async.series([
                function(callback){
                    console.log("I'm inside fileExists function");
                    var result = '';
                    request.get('http://tobeymotos.com.br/video.mp4', function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            var video = body;
                            console.log("File exists and is OK");
                            var result = true;
                            console.log("Valor da result", result);
                        }
                        else{
                            console.log("This file do not exists, check error: "+ error);
                            var result = "xixi";
                        }
                    });
                    // usar aqui
                    callback(null, result);
                },
                function(callback){
                    // catch video duration
                    file = "http://tobeymotos.com.br/video.mp4"; // used as e.g.
                    console.log("I'm inside getVideoDuration function");
                    getDuration(file).then(function (duration) {
                        console.log("Duração do vídeo: " +duration);
                        return duration;
                    });
                    callback(null, 'b');
                },
                function(callback){
                    // code c
                    callback(null, 'c');
                },
                function(callback){
                    // code d
                    callback(null, 'd');
            }],
            // optional callback
            function(err, results){
                console.log(results);
            }
            )

            return 0;           
        }
    } else {
        console.log("Error: "+error);
    }
});

我正在使用 async.series 按顺序执行一些 functions,因为我依赖于第一个的结果来继续下一个。

如您所见,我在第一个 function 中有一个“request.get”,其中:

request.get('http://tobeymotos.com.br/video.mp4', function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                        var video = body;
                        console.log("File exists and is OK");
                        var result = true;
                        console.log("Valor da result", result);
                    }
                    else{
                        console.log("This file do not exists, check error: "+ error);
                        var result = "xixi";
                    }
                });
                // usar aqui
                callback(null, result);

问题是我无法在 callback 中调用结果,它只是不“exitrequest.get

有帮助吗?

request({url: API_URL}, function (error, response, body) {

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

        console.log("Items received with success.");
        var data = JSON.parse(body);

        // catch duration from video
        for(var list in data) {
            var item = data[list];

            async.series([
                function(callback){
                    console.log("I'm inside fileExists function");
                    var result = '';
                    request.get('http://tobeymotos.com.br/video.mp4', function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            var video = body;
                            console.log("File exists and is OK");
                            var result = true;
                            console.log("Valor da result", result);
                            callback(null, result);
                        }
                        else{
                            console.log("This file do not exists, check error: "+ error);
                            var result = "xixi";
                            callback(null, result);
                        }
                    });
                    // usar aqui

                },
                function(callback){
                    // catch video duration
                    file = "http://tobeymotos.com.br/video.mp4"; // used as e.g.
                    console.log("I'm inside getVideoDuration function");
                    getDuration(file).then(function (duration) {
                        console.log("Duração do vídeo: " +duration);
                        return duration;
                    });
                    callback(null, 'b');
                },
                function(callback){
                    // code c
                    callback(null, 'c');
                },
                function(callback){
                    // code d
                    callback(null, 'd');
            }],
            // optional callback
            function(err, results){
                console.log(results);
            }
            )

            return 0;           
        }
    } else {
        console.log("Error: "+error);
    }
});

您的回调在 request.get 函数之外,由于 Node JS 的性质,这可能导致您的回调在请求 returned 之前调用。 Node JS 是非阻塞的,因此除非明确告知,否则不会等待一个功能执行后再继续下一个功能。将回调放在 request.get 响应函数中将强制它等待对 return 的请求,然后用结果

执行回调