使用javascript回调

时间:2016-11-28 05:34:29

标签: javascript node.js

我正在使用javascript和nodejs创建项目。我在我的函数里面集成回调for循环与条件基础,但我无法做到这一点。我的问题是回调是在循环的第一次迭代完成的。这是我的代码:

function tagEndpointNames(callback) {

    var data = userGenerateToken();
    var sql = "SELECT * FROM topology_data WHERE topology_coordinates !='' and topology_uuid is not null"

    var query = conn.query(sql, function(err, tagEndpointNames) {

        for (var i = 0; i < tagEndpointNames.length; i++) {
            var topologytagData = {
                "topology_tag": tagEndpointNames[i].topology_uuid
            }

            var tpCooridinates = JSON.parse(tagEndpointNames[i].topology_coordinates);

            for (var j = 0; j < tpCooridinates.stageObjects.length; j++) {

                if (tpCooridinates.stageObjects.length) {

                    if (tpCooridinates.stageObjects[j].endPointId) {

                        if (isGuid(tpCooridinates.stageObjects[j].endPointId)) {

                            var endPointUUID = tpCooridinates.stageObjects[j].endPointId;
                            var _ro = require('request');

                            var url = url;

                            var _d = '';

                            _ro({
                                url: url,
                                method: 'POST',
                                headers: {
                                    'Content-Type': 'application/json',
                                    'Authorization': 'Bearer ' + data['access_token']
                                },

                                json: topologytagData

                            }, function(_e, _r, _b) {

                                if (_r.statusCode == 200 && !_e) {

                                    callback()
                                        //return;
                                } else {

                                    callback()
                                    console.log("andarss")
                                    return;
                                }

                            })
                        }
                    }
                }
            }
        }

    })
}

这是函数调用:

tagEndpointNames(function(){
            console.log ('Server Closed during MIGRATION JOB 4');
            server.close(function () {
                process.exit(0);
            });
        })

3 个答案:

答案 0 :(得分:0)

当您在for循环中使用回调运行异步进程时,请记住来自callee的回调将在循环内完成的第一个事件中触发。在你的情况下request lib调用是for循环中的一个异步进程,你需要在你想要回调被调用者之前处理来自所有请求调用的所有回调。

请阅读: How to write asynchronous functions for Node.js

答案 1 :(得分:0)

也许是时候开始使用Javascript Promise了。

答案 2 :(得分:0)

Node的async库将帮助您完成此类任务。

使用 async waterfall 。它运行一系列函数,每个函数将结果传递给数组中的下一个。但是,如果任何函数将错误传递给回调,则不执行下一个函数,并立即调用主回调并显示错误。

<强> JS

var create = function (req, res) {
    async.waterfall([
        _function1(req),
        _function2,
        _function3
    ], function (error, success) {
        if (error) { alert('Something is wrong!'); }
        return alert('Done!');
    });
};

function _function1 (req) {
    return function (callback) {
        var something = req.body;
        callback (null, something);
   }
}

function _function2 (something, callback) {
    return function (callback) {
       var somethingelse = function () { // do something here };
       callback (err, somethingelse);
    }
}

function _function3 (something, callback) {
    return function (callback) {
      var somethingmore = function () { // do something here };
      callback (err, somethingmore);
    }
}

Reference