如何等待回调?

How do I wait for callback?

我调用了一个函数,它使用 chrome.gcm 来注册一个 registrationId。一切都很好,但由于回调需要时间,如果没有 console.log 或警报,我的代码将无法运行。有什么提示可以让它等待吗?

 var registrationId = ""

function register() {
  var senderId = 'MY_SENDER_ID';
  chrome.gcm.register([senderId], registerCallback);
}


function registerCallback(regId) {
  registrationId = regId;
  if (chrome.runtime.lastError) {
    return false;
  }
  chrome.storage.local.set({registered: true});
 }


$(function(){
  $("#register-form").submit(function(e) {
    //Disable from further calls
    $('#submit').disabled = true;
    register()
    var name = $('#name').val()
    var email = $('#email').val()
    //Insert console.log or alert here to slow it down
    var chromeId = registrationId

    $.ajax({
         type: "POST",
         url: 'MY_URL',
         ajax:false,
         data: {chromeId: chromeId, name: name, email:email},
         success: function(result)
         {
           console.log(result)
         }
       });
  });
})

register() 之后的代码应该进入一个接受 registrationId 作为参数的新回调,并传递给 register()。然后,register() 可以使用从 chrome.gcm.register 返回的 registrationId 调用此回调。不需要全局 registrationId 变量。

function register(callback) {
  var senderId = 'MY_SENDER_ID';
  chrome.gcm.register([senderId], function (regId) {
      if (chrome.runtime.lastError) {
        return false;
      }
      chrome.storage.local.set({registered: true});
      callback(regId);
  });
}

$(function(){
  $("#register-form").submit(function(e) {
    //Disable from further calls
    $('#submit').disabled = true;
    register(function (registrationId) {
      var name = $('#name').val()
      var email = $('#email').val()
      //Insert console.log or alert here to slow it down
      var chromeId = registrationId

      $.ajax({
           type: "POST",
           url: 'MY_URL',
           ajax:false,
           data: {chromeId: chromeId, name: name, email:email},
           success: function(result)
           {
             console.log(result)
           }
         });
    });
  });
})

Promises 和 async/await 也有助于处理此类问题。

您需要将方法作为回调的一部分执行,因为需要作为 AJAX 请求的一部分传入的值仅在 ASYNC 进程完成后可用。 在这种情况下,您可以使用 Deferred 对象。一旦问题得到解决,您就可以执行 AJAX 调用。

$(function() {
  $("#register-form").submit(function(e) {
    //Disable from further calls
    $('#submit').disabled = true;

    var senderId = 'MY_SENDER_ID';
    // Store the promise in a variable
    var complete = chrome.gcm.register([senderId]);

    // When resolved it will, hit the callback
    // where you have access to the value
    // which is then passed to your AJAX request 
    $.when(complete).done(function(regId) {
      var registrationId = regId;
      if (chrome.runtime.lastError) {
        return false;
      }
      chrome.storage.local.set({
        registered: true
      });
      $.ajax({
        type: "POST",
        url: 'MY_URL',
        ajax: false,
        data: {
          chromeId: registrationId,
          name: name,
          email: email
        },
        success: function(result) {
          console.log(result)
        }
      });
    });
  });
});