在Javascript中完成单独的函数之前,请等待异步回调完成

在Javascript中完成单独的函数之前,请等待异步回调完成,javascript,asynchronous,Javascript,Asynchronous,如果这是一个重复,我很抱歉,但我能找到的只是帮助让函数完成或无关语言,而不是之后要做什么。无论如何 我还有另外两个相互关联的函数。一个调用nameyapi,它在回调中返回一个随机名称,我使用它来更新元素。这是我的randomizePANameListeners函数 我的第二个函数从这两个元素中获取名字和姓氏,并使用它们创建一个随机用户名。这是我的randomizeAppNameListeners randomizePANameButton.addEventListener("click", fu

如果这是一个重复,我很抱歉,但我能找到的只是帮助让函数完成或无关语言,而不是之后要做什么。无论如何

我还有另外两个相互关联的函数。一个调用nameyapi,它在回调中返回一个随机名称,我使用它来更新元素。这是我的randomizePANameListeners函数

我的第二个函数从这两个元素中获取名字和姓氏,并使用它们创建一个随机用户名。这是我的randomizeAppNameListeners

randomizePANameButton.addEventListener("click", function(e) {

              //  Check the gender of the PA
            var isChecked = document.getElementById("gender56").checked;

              //  Use a self-invoking function to make sure the names are
              //  updated correctly
            (function() {
              if (isChecked === true) {
                namey.get({ type: 'male', with_surname: 'false', frequency: 'all', callback: function(n) { document.getElementById("fName").value = n }});
              } else {
                namey.get({ type: 'female', with_surname: 'false', frequency: 'all', callback: function(n) { document.getElementById("fName").value = n }});
              }

                //  Set the surname as well
              namey.get({ type: 'surname', with_surname: 'false', frequency: 'all', callback: function(n) { document.getElementById("lName").value = n }});
            })()
并且,附加到第二个按钮的事件侦听器:

    var fName = document.getElementById("fName").value.substring(0, 3);
    var lName = document.getElementById("lName").value;
    var randomDigits = (Math.random() * (100 - 10) + 10).toFixed(0);

    return fName + lName + ".UAT" + randomDigits;
现在,我有一个按钮,通过将所有这些事件侦听器绑定在一起,使一切变得更容易。我的easy按钮为我做了一切,但当它调用这两个时,它会使用元素中的当前值来生成随机名称,然后创建一个新的应用程序名称,而不会使用新的PA名称


那么,使用普通JavaScript,如何在完成第二个函数之前等待第一个函数完成呢?我不希望创建一个不需要的全局变量。

您可以尝试使用承诺-


这应该是有效的:)

是的,使用承诺,这在您的场景中完全有效,如果您使用jquery,您可以使用延迟


在本机javascript中,您可以在自己的函数中使用回调

var myFunction = function(complete) {
  /* Do things here first */
  complete();
}
myFunction(function(){
  /* Do Something else here after the first has completed */
});

虽然这可以从理论上回答这个问题,但请在这里包括答案的基本部分,并提供链接供参考。您的评论最接近于帮助我。我本想将这两个函数的作用域分开,但最后我将函数调用放在了姓氏的回调函数中,以创建应用程序名。