等待异步回调完成,然后在Javascript中完成单独的功能

时间:2015-05-12 16:58:16

标签: javascript asynchronous

道歉,如果这是重复,但我能找到的只是帮助让功能完成或不相关的语言,而不是后续做什么。总之...

所以,我有两个其他不相关的功能。一个调用Namey API,它在回调中返回一个随机名称,我用它来更新一个元素。这是我的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;

现在,我有一个按钮,通过将所有这些事件监听器绑在一起,使一切变得更容易。我的简单按钮为我做了一切,但当它调用这两个时,它会使元素中的当前值生成随机名称,然后创建一个新的应用程序名称,它不会采用新的PA名称。

因此,使用vanilla JavaScript,如何在完成第二个函数之前等待第一个函数完成?我宁愿不创建一个不需要的全局变量。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以尝试使用承诺 - http://www.html5rocks.com/en/tutorials/es6/promises/

这应该有效:)

答案 2 :(得分:-1)

是使用适用于您的场景的promises,如果您使用的是jquery,则可以使用deferred。

https://api.jquery.com/jquery.deferred/