我该如何等待回拨?

时间:2016-02-17 01:24:00

标签: javascript jquery google-chrome google-chrome-extension google-cloud-messaging

我调用一个注册registrationId的函数是使用chrome.gcm发出的。一切都很好,但因为回调需要时间,没有console.log或alert,我的代码不起作用。我有什么技巧可以让它等待吗?

 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)
         }
       });
  });
})

2 个答案:

答案 0 :(得分:1)

register()之后的代码应该进入一个新的回调函数,该回调函数接受registrationId作为参数,并传递给register()。然后,register()可以使用从registrationId返回的chrome.gcm.register来调用此回调。无需全局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也有助于这样的事情。

答案 1 :(得分:1)

您需要将该方法作为回调的一部分执行,因为需要作为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)
        }
      });
    });
  });
});