从嵌套的jquery-ajax-get请求返回数据

return data from nested jquery ajax get request

本文关键字:返回 数据 请求 jquery-ajax-get 嵌套      更新时间:2023-09-26

我有两个JAVASCRIPT API Get调用,我正在使用JQUERY进行。我想将在第二次调用中构建的HTML附加到DOM中。

第一个调用获取一些数据。我循环浏览这些数据的长度,对每个索引进行第二次调用。

在第二次调用中,我构建了HTMLContent。

完成所有调用后,我将HTMLContent附加到DOM中。

我很难在第一次调用中返回HTMContent,因为我只想在DOM完全构建好后追加它。在我创建的for循环之外执行AND。

我知道我可以在第二次通话中附加完成的内容,但我真的很想知道如何返回。

我想也许我需要创建一个promise,但不确定这是否有帮助,因为范围仍然包含在第二个get请求.done func 中

这就是我到目前为止所拥有的。

var gallery = (function($){
    var init,
        firstGetCall,
        secondGetCall,
        HTMLContent = '';
    init = function(){
        // Make first call
        firstGETCall();
    };
    // Declare firstGETCall func
    firstGETCall = function(){
        $.ajax({
            url: 'http://example.com/data.json',
            type: 'GET',
            data: {
                numberOfItems: 10
            }
        })
        .done(function(data) {
            //  Cycle through each data element
            for (var i = 0; i < data.length; i++) {
                // Make second call
                secondGetCall(data[i]);
            };
        })
        .fail(function(error) {
            console.log(error);
        });
        // I want to append the DOM here with the conplete HTMLContent - built up of 10 x <div><img... elements
        // However I'm stuck as to how to return the complete HTMLContent
    };
    // Declare secondGetCall func
    secondGetCall = function(singleData) {
        $.ajax({
            url: 'http://example.com/data-2.json',
            type: 'GET',
            data: {
                type: singleData
            }
        })
        .done(function(data) {
            // Build HTMLContent
            HTMLContent = '<div><img src="' + data.image + ' title="' + data.subTitle + ' alt="Photo"></div>';
            // I do not want to append the DOM here
            // return HTMLContent doesn't work
        })
        .fail(function(error) {
            console.log(error);
        });
    };
    return {
        init: init
    };
})(jQuery);

gallery.init(jQuery);

首先最重要的一点:

我想在这里附加DOM。。。

不管怎样,在你发表上述评论的地方你什么都做不了

由于Ajax是异步工作的(除非您指定相反的语句,但强烈建议您这样做(,所以在$.ajax启动后几微秒,即在构建整个HTML之前很长一段时间,您指定的位置的任何语句都将被执行。

现在这似乎也很奇怪:

我很难在第一次呼叫时将HTMContent返回

首先是因为,同样由于异步模式,您不能期望从Ajax调用的.done()返回任何内容
但也因为我不明白你为什么要"返回"一个已经在更高级别可用的数据。事实上,你只需要在它可用时得到通知。

另一方面,我完全同意最好只向DOM添加一次HTML,以减少时间消耗。

然后,为了实现这一点,我的第一个想法是:为什么不简单地拥有一个唯一的服务器功能,返回所需的整套数据,而不是两个不同的数据

然而,如果由于某种原因确实不可能,您可能会让Ajax调用同步工作(但您应该再次避免(
在这种情况下,您必须:

  1. secondGetCall()函数中,稍微修改.done()主体语句,将新数据附加到HTMLContent,而不仅仅是设置它:HTMLContent += '<div>...</div>'
  2. 在两个Ajax调用中的每一个调用中,都将async: false添加到Ajax对象中
  3. 编写一条语句,将HTMLContent附加到DOM中您编写注释的位置