【问题标题】:how to stop first function get json till second function getjson return data如何停止第一个函数获取json直到第二个函数getjson返回数据
【发布时间】:2017-05-10 20:30:24
【问题描述】:

大家好,我在 Apache Cordova 中制作手风琴菜单(嵌套)时遇到问题。 我必须使用两个 getjson 来获取类别和子类别。 第一个函数的中间我调用第二个函数来获取子类别,但是第二个函数没有返回我最喜欢的包含 htmlSubCategories 的字符串,它返回未定义的值

     //Function 1
  var Categoriesdata = [];
function getCategories()
{
    var htmlCategories = "";
    $.getJSON('http://example.com/Categories', null, function (Categoriesdata) {
        for (var i = 0; i < Categoriesdata.length ; i++)
        {
            {
                htmlCategories += "<li>";
                htmlCategories += "<a href='#'> " + Categoriesdata[i].Text + "</a>";
                htmlCategories += getCategoriesRev(Categoriesdata[i].Id);
                htmlCategories += "</li>";
            }
       }
            $(".Categories").html(htmlCategories);  
    });
}

  //Function 2
function getCategoriesRev(Id)
{
    var htmlSubCategories = "";
    $.getJSON('http://example.com/CategoriesRev', { id: Id }, function (CategoriesdataRev) {

        if (CategoriesdataRev.length > 0)
        { 
            for (var j = 0; j < CategoriesdataRev.length; j++) {
                htmlSubCategories += "<li>";
                htmlSubCategories += "<a href='#'> " + CategoriesdataRev[j].Text + "</a>";
                htmlSubCategories += getCategoriesRev(CategoriesdataRev[j].Id);
                htmlSubCategories += "</li>";
            }
            htmlSubCategories = "<ul class='submenu'>" + htmlSubCategories + "</ul>";

        }
  return htmlSubCategories;
    });

}

【问题讨论】:

  • 你的问题不清楚,请解释清楚
  • 您是否尝试过在第二个函数的末尾添加.always(data) 并返回其中的值?这样,您应该能够在数据准备就绪时返回数据。
  • 这部分是什么:$.getJSON('CategoriesRev' 应该做什么?
  • @vahdet 可以描述更多
  • 您的两个函数都调用相同的数据并且您没有添加任何不同的元素来在您的应用程序中设置数据,您正在调用相同的函数 getCategoriesRev 并使用未定义的 i在你的第二个功能!首先更正您自己的代码,然后让我们知道它是否有效。

标签: javascript function cordova getjson


【解决方案1】:

AJAX 请求是异步的,这意味着第二次调用不会在它返回时完成,htmlSubCategories 仍然是一个空字符串。

在 JavaScript 中,您使用回调或 Promises 编写异步代码。幸运的是,使用 jQuery 完成的 AJAX 请求会返回一个可以使用的 Promise。

我还建议不要为您拥有的每个子类别进行一次 AJAX 调用。我只会调用一次来获取所有内容,然后使用 JavaScript 进行过滤。

但是使用您现在所拥有的,以下解决方案使用简单的 jQuery:

//Function 1
function getCategories()
{
    $.getJSON('http://example.com/Categories', function (Categoriesdata) {
        var $categories = $('.Categories').html('');
        for (var i = 0; i < Categoriesdata.length ; i++)
        {
            $categories
                .append('<li>'
                          + '<a href="#">'
                              + Categoriesdata[i].Text
                          + '</a>'
                          + '<ul id="' + Categoriesdata[i].Id + '"></ul>'
                      + '</li>');

            getCategoriesRev(Categoriesdata[i].Id);
        }
    });
}

  //Function 2
function getCategoriesRev(Id)
{
    $.getJSON('http://example.com/CategoriesRev', { id: Id },
        function(CategoriesdataRev) {
            var $subCategoryUl = $('.Categories').find('ul#' + Id);
            if (CategoriesdataRev.length > 0)
            { 
                for (var i = 0; i < CategoriesdataRev.length; i++)
                {
                    $subCategoryUl
                        .addClass('submenu')
                        .append('<li>'
                                  + '<a href="#"> '
                                      + CategoriesdataRev[i].Text
                                  + '</a>'
                              + '</li>');
                }
            }
            else
                $subCategoryUl.remove();
        });
}

【讨论】:

  • 您的代码仍然返回未定义的值
  • 正确,两个函数都是void。但是,您的 $('.Categories') 元素应正确填充
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2021-05-30
  • 1970-01-01
  • 2019-02-16
  • 2022-12-19
相关资源
最近更新 更多