Javascript函数运行两个路由

时间:2017-05-30 21:16:03

标签: javascript asynchronous synchronization

仍有问题。当我调用此函数时,它似乎返回两次???我得到了'test2'在控制台中,然后进行“测试”。我还将回调返回值放入控制台,然后将其设置为false。 getwidget仅从this.nextwidget调用一次,这是一个按钮。

      getwidget = function (callback) {
          var id = get_name_value('salesperson');
          var password = 'password';
          if (id !== "") {
              $.get('http://somewhere.com?id=' + id + '&password=' + password,
                  function (data, status) {
                      console.log(status);
                      if (status === 'success') {
                        catalogue = $.parseJSON(data);
                        if (catalogue.status === "error") {
                            alert(catalogue.message);
                        } else {
                            console.log('test');
                            if (callback) callback(true);
                        }
                      } else {
                        alert("Error connecting to API:" + status);
                      }
                  });
          }
          console.log('test2');
          if (callback) callback(false);
      };

      this.nextwidget = function() {
          catindex = catindex + 1;

          getwidget(function(trigger) {
            if (!trigger && catindex > 0) {
                catindex = catindex - 1;
            }
            if (catindex === catlen - 1) {
                document.getElementById("nextwidget").disabled = true;
            }
            if (catindex !== 0) {
                document.getElementById("prevwidget").disabled = false;
            }
            console.log(catindex);
            console.log(trigger);
          });
      };

1 个答案:

答案 0 :(得分:2)

Javascript是异步的。 $。get 操作是异步的,因为它是对服务器的调用。

这意味着JS不会等到此操作结束,只是继续激活下一个代码块。 因此,根据您的代码,它显示了' test2'在控制台中,使用 false 参数执行回调。只有当收到服务器的响应时,才会显示" test"在控制台中并使用 true 参数运行回调。 (当然,如果请求成功,根据您的代码段)

这是一个简单的jsfiddle,可以更好地理解它是如何工作的。 Simple async example

function asyncExample() {
  setTimeout(function() {
    console.log('test');
  }, 1000);

  console.log('test2')
}

asyncExample();

由于超时中的操作被延迟(如异步),JS不会等待并继续下一行。结果将是: ' TEST2'首先然后测试'。