【问题标题】:Use callback with javascript通过 javascript 使用回调
【发布时间】:2017-04-11 18:55:23
【问题描述】:

我正在使用 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);
            });
        })

【问题讨论】:

  • 你的代码格式让我在尝试阅读时脑出血
  • 我认为你在 if/else 条件下都使用了回调。
  • var url = url; 是什么意思?
  • url 是请求去的 url 只是临时写入 url
  • 请通过 JS lint 运行您的代码并修复行尾缺少的分号。我注意到至少有两个。

标签: javascript node.js


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      使用异步瀑布。它运行一系列函数,每个函数将其结果传递给数组中的下一个。但是,如果任何函数将错误传递给回调,则不会执行下一个函数,并且会立即调用主回调并返回错误。

      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

      【讨论】:

        猜你喜欢
        • 2015-05-29
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多