0

我正在使用一个jQuery名为的库MockAjax,它允许您模拟/测试真正的 AJAX 调用。

在我的应用程序中,我可以使用 AJAX 请求的实时应用程序版本,MockAjax并将拦截 AJAX 请求并以 Mock 响应进行响应!

我还在使用另一个M<ockJson类似的库,但它允许您生成模拟 JSON 响应。

一起使用这两个库,我的应用程序发出 AJAX 请求。 MockAjax捕获 AJAX 请求,然后MockJson生成并返回随机JSON响应。

在我过去的项目中,这一直很好,直到今天都没有问题......

现在我的应用程序运行良好,我决定是时候将 JavaScript 重组为更结构化的版本了。(将 DOM 事件、任务等放入代码段)。

这就是我的问题开始的地方......

在我的新代码中,

  1. 我的应用程序发出 AJAX 请求。
  2. MockAjax捕获AJAX请求。
  3. MockJson被调用以获得JSON响应
  4. 错误这就是一切都出错的地方......

在这最后一步,它应该将JSON响应传递回原来的AJAX调用Success函数。它根本没有!

我在控制台中没有任何错误或任何内容。alert()我在我的 AJAX 调用函数中设置了一个简单的success()函数,它甚至无法触发警报!

我不确定是否存在某种范围问题或问题可能是什么。当我的应用程序是扁平的时,glbal 根级别中的所有变量和函数都没有应用程序的结构......一切都有效。一旦我将所有内容都移到对象等中......除了没有将 MockAjax 响应返回到 Real Ajax 响应的 1 个问题之外,它一切正常!

我删除了 95% 的应用程序代码并重新构建了它,只需要运行这个示例问题。问题的演示在这里... http://jsbin.com/vugeki/1/edit?js

应用流程:

  • projectTaskModal.init();在页面加载时运行
  • This fires off projectTaskModal.mockAjax.init();设置MockAjaxMockJson代码
  • 然后projectTaskModal.task.openTaskModal(projectTaskModal.cache.taskId);运行执行AJAX请求
  • AJAX POST Request被发送到/gettaskevents
  • MockAjax捕获发送到的请求/gettaskevents
  • MockAjax然后调用MockJson生成JSON响应。 projectTaskModal.mockAjax.generateTaskEventsJson();调用该函数,我让它将 JSON 响应打印到控制台中,这样我就可以看到它正在生成它!
  • 在我的MockAjax代码中,var taskevents保存JSON响应,然后将其设置为此... this.responseText = taskevents;``this.responseText I believe is what is supposed to be returned to the Applications originalAJAX` 调用。看来这就是问题所在!它似乎没有将响应返回到最初请求它的原始 AJAX 代码!

这可能是某种范围问题吗?

var projectTaskModal = {

    cache: {
        taskId: 1,
        projectId: '12345',
    },


    init: function() {
        projectTaskModal.mockAjax.init();
      //console.log(projectTaskModal.mockAjax.init.generateTaskEventsJson());
        projectTaskModal.task.openTaskModal(projectTaskModal.cache.taskId);
    },


    task: {


        openTaskModal: function(taskId) {
            // Load Task Events/Comments Panel from AJAX Request
            projectTaskModal.task.loadTaskEventsPanel(taskId);
        },

        /**
         * Load Task Events/Comments from backend Database JSON
         * @param  {string} jsonServerEndpoint URL for AJAX to Request
         * @return {string} Generated HTML of all Task Events built from JSON
         */
        loadTaskEventsPanel: function(taskId) {


            // Request Task Events and Comments using AJAX Request to Server
            $.ajax({
                type: 'POST',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                url: '/gettaskevents',
                data: {
                    action: 'load-task-events',
                    task_id: projectTaskModal.cache.taskId
                },
                success: function(data) {

alert('TESTING AJAX SUCCESS CALLBACK WAS CALLED!');

                    console.log('function loadTaskEventsPanel(taskId) DATA: ');
                    console.log(data);

                    // Parse JSON data
                    var taskEventsJson = data;
                    var task_events = taskEventsJson.task_events;

                    // Loop over each Task Event record returned
                    $.each(task_events, function(i, event) {
                        console.log('commentID: ' + event.commentId);
                        console.log('create_at DateTime: ' + event.created_at);
                    });

                }
            });
        },

    },


    mockAjax: {
        init: function(){

          // Adding the @EVENT_TYPE keyword for MockJSON Template Usage
          $.mockJSON.data.EVENT_TYPE = [
              'Comment Created',
              'Task Status Changed',
              'Task Completed'
          ];



          // Mock AJAX response for AJAX request to /gettaskevents
          $.mockjax({
              url: '/gettaskevents',
              contentType: 'text/json',
              responseTime: 2900, // Simulate a network latency of 750ms
              response: function(settings) {
                  console.log('mockJax POST to /gettaskevents :');
                  //console.log(settings);
                  //DEBUG('Get Task Events JSON', settings.data);
                  if(settings.data.value == 'err') {
                     alert('MockAjax Error');
                     this.status = 500;
                     this.responseText = 'Validation error!';
                  } else {
                     alert('MockAjax Success');
                     //var taskevents = generateTaskEventsJson();
                     var taskevents =  projectTaskModal.mockAjax.generateTaskEventsJson();
                     this.responseText = taskevents;
                     console.log(taskevents);
                  }
              }
          });

        },



          // Generate Mock JSON Response to load fake Task Evewnt/Comments JSON for Mock AJAX request
          //var generateTaskEventsJson = function () {
          generateTaskEventsJson: function() {
            var mockTaskJson = $.mockJSON.generateFromTemplate({
            "task_events|10-14" : [{
                "commentId|+1" : 100000000,
                "projectId|+1" : 100000000,
                "taskId|+1" : 100000000,
                "userId|+1" : 100000000,
                "created_at" : "@DATE_YYYY-@DATE_MM-@DATE_DD",
                "event_type" : "@EVENT_TYPE",
                "userName" : "@MALE_FIRST_NAME @LAST_NAME",
                "description" : "@LOREM_IPSUM @LOREM_IPSUM"
              }]
            });
            //DEBUG('Generate Mock Task Events JSON', mockTaskJson.task_events);
            //console.log(mockTaskJson.task_events);
            //return mockTaskJson.task_events;
            return mockTaskJson;
          }







    },


};

$(function() {
    projectTaskModal.init();
});
4

1 回答 1

1

您的 JSBin 示例表明您使用的是非常旧的 Mockjax 版本(1.5.0-pre)。最新的是最近发布的 1.6.2(我现在是核心维护者)。以下是更新后的 JSBin 的链接,其中一切似乎都运行良好。您正在运行的旧版本的 Mockjax 是在 jQuery 2.0 存在之前创建的,因此不支持它(1.6.2 支持)。

http://jsbin.com/qucudelev/1/

所以...更新您的 Mockjax 版本以使用 Bower、npm 或仅使用来自主帐户(我的)的 Rawgit(https://rawgit.com/jakerella/jquery-mockjax/master/jquery.mockjax.js)而不是您自己的非常过时的叉子!

祝你好运。

于 2015-04-22T17:05:10.430 回答