在java脚本中第一个函数完全完成后调用第二个函数

时间:2017-12-28 10:12:52

标签: javascript jquery

我有一个javascript函数,它是加载帮助菜单列表(下拉列表)。

第一个功能 GetPageKeyword()

function GetPageKeyword() {
    var url = window.location.href.replace(window.location.origin, '').replace('/#', '').replace('#', '').replace('//', '/');
    url = url.split("?")[0];
    url = GetURL(url);
    if (url.lastIndexOf('/') == (url.length - 1))
        url = url.slice(0, -1);
    if (url.indexOf('/') == 0)
        url = url.substring(1, url.length);
    $.ajax({
        url: "/api/PageKeywords/GetLabelsByUrl",
        type: 'Get',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        cache: false,
        data: { url: url },
        success: function (data) {
            var res = data.data;
            var htmlAppend = '<a id="hlpMenuLink" class="dropdown-toggle" data-toggle="dropdown"><i style="font-size: 17px;" class="fa fa-question-circle"></i></a>';
            if (res.length > 0) {
                $.getJSON("https://test.com/search.json?label_names=" + res[0].labels,
                    function (data) {
                        if (data.results.length > 0) {
                            htmlAppend += '<ul id="menuHelpUl" class="dropdown-menu pull-right">';
                            for (var i = 0; i < data.results.length; i++) {
                                htmlAppend += "<li><a href='" + data.results[i].html_url + "' target=\"_blank\">" + data.results[i].name + "</a></li>";
                            }
                            htmlAppend += "</ul>";
                        }
                        $('#helpMenu').html(htmlAppend);
                    });
            }
            $('#helpMenu').html(htmlAppend);

            setTimeout(function () { GetArticulateDetails(); }, 1100);

        },
        error: function (jqXhr, textStatus, errorThrown) {
            var err = jqXhr;
        }
    });
}

但现在我需要添加更多项目来帮助菜单。 在第二个函数中,我尝试将新项添加到我在第一个函数中构建的ul id =“menuHelpUl”。

第二项功能 GetArticulateDetails()

function GetArticulateDetails() {
    var url = window.location.href.replace(window.location.origin, '').replace('/#', '').replace('#', '').replace('//', '/');
    url = url.split("?")[0];
    url = GetURL(url);
    if (url.lastIndexOf('/') == (url.length - 1))
        url = url.slice(0, -1);
    if (url.indexOf('/') == 0)
        url = url.substring(1, url.length);
    $.ajax({
        url: "/api/PageKeywords/GetArticulateLabelByUrl",
        type: 'Get',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        cache: false,
        data: { url: url },
        success: function (data) {
            var res = data.data;
            var htmlAppend = '<hr/>';
            if (res.length > 0) {
                for (var i = 0; i < res.length; i++) {
                     htmlAppend += "<li><a href='../HelpMenu/" + res[i].location + "/" + res[i].articulateIdentifier.trim() + "/index.html' target=\"_blank\">" + res[i].name + "</a></li>";
                }
            }
            $('#menuHelpUl').append(htmlAppend);
        },
        error: function (jqXhr, textStatus, errorThrown) {
            var err = jqXhr;
            console.log(err);
        }
    });
}

在成功响应的第一个函数Ge​​tPageKeyword中,我正在调用第二个函数

 setTimeout(function () { GetArticulateDetails(); }, 1100);

这里我遇到问题某些情况下第二个功能无效,因为它可能无法找到#helpMenu的id。

代码:function:GetArticulateDetails: - $('#helpMenu')。html(htmlAppend);

所以在完成第一个函数之后,我将如何调用我的第二个函数。

6 个答案:

答案 0 :(得分:1)

在你的第一个方法中调用

$('#helpMenu').html(htmlAppend)

应该在getJson(...)

的处理程序中

目前在该方法完成之前调用它,但依赖于该异步回调生成的数据。

(我给你一个明确的代码更改,但很难在手机上编辑)

编辑 - 实际上上面的行是重复的。可以删除处理程序外部的那个。也许有重复的ID?

您还可以在更新Html后从getJson处理程序中调用第二个方法。

menuHelpUl仅在getJson中的调用返回某些数据时才存在。如果没有,就没有元素。

答案 1 :(得分:1)

尝试在ajax成功回调结束时调用第二个函数:

fhand=open(romeo.txt)
arr=list()
count=0
for line in fhand:
    words=line.split()
    if words in arr: 
        continue
    else:
        arr=arr+words

arr.sort()
print(arr)

此外,也许有必要通过

来保护这个电话
$.ajax({
    /* settings */
    success: function (data) {
        var res = data.data;
        var htmlAppend = '<a id="hlpMenuLink" class="dropdown-toggle" data-toggle="dropdown"><i style="font-size: 17px;" class="fa fa-question-circle"></i></a>';
        if (res.length > 0) {
            $.getJSON("https://test.com/search.json?label_names=" + res[0].labels,
                function (data) {
                    if (data.results.length > 0) {
                        htmlAppend += '<ul id="menuHelpUl" class="dropdown-menu pull-right">';
                        for (var i = 0; i < data.results.length; i++) {
                            htmlAppend += "<li><a href='" + data.results[i].html_url + "' target=\"_blank\">" + data.results[i].name + "</a></li>";
                        }
                        htmlAppend += "</ul>";
                    }
                    $('#helpMenu').html(htmlAppend);
                    GetArticulateDetails(); // here !
                });
        }
        $('#helpMenu').html(htmlAppend);
    }
});

答案 2 :(得分:1)

使用javascript中的promises尝试此解决方案:

rates=as.numeric(gsub(",", ".", gsub("%", "e-2", rates)))

这样称呼:

function GetPageKeyword() {
    return new Promise((resolve, reject)=>{
        //your code here
        resolve();
    });
}

function GetArticulateDetails() {
    return new Promise((resolve, reject)=>{
        //your code here
        resolve();
    });
}

这是编辑的第一个函数:

GetPageKeyword().then((result)=>{
    GetArticulateDetails();
}).catch((error)=>{
    //handle error
});

答案 3 :(得分:1)

将menuHelpUl声明为这样的ui元素:

var menuHelpUl = $('<ul id="menuHelpUl" class="dropdown-menu pull-right">');

并在循环中将li元素附加到它

var li = $("<li><a href='" + data.results[i].html_url + "' target=\"_blank\">" + data.results[i].name + "</a></li>");
menuHelpUl .append(li);

现在将menuHelpUl传递给ajax成功的GetArticulateDetails:

GetArticulateDetails(menuHelpUl);

并在ajax成功中使用它

menuHelpUl.append(htmlAppend);

答案 4 :(得分:0)

从代码

看起来 $('#helpMenu') 是空的或未定义的。

尝试检查 $('#helpMenu') null 取消发现状态

**if($('#helpMenu') == null || $('#helpMenu') == undefined)**

然后执行追加html操作。

答案 5 :(得分:0)

您可以使用jquery.when

$.when(GetPageKeyword()).then(GetArticulateDetails());