2

Я вызываю функцию, которая регистрирует регистрацию, выдается с использованием chrome.gcm. Все в порядке, но поскольку обратный вызов требует времени, мой код не работает без 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) 
     } 
     }); 
    }); 
}) 

ответ

1

Вам необходимо выполнить этот метод как часть обратного вызова, поскольку значение, которое необходимо передать как часть вашего запроса AJAX, доступно только после завершения процесса ASYNC. Вы можете использовать объекты Отложенные в таких случаях. Как только он будет разрешен, вы можете выполнить вызов 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) 
     } 
     }); 
    }); 
    }); 
}); 
+0

Вы должны упомянуть, что это не ванильный javascript (а также недопустимый jQuery). Кажется, что либо используется 'when.js', либо вы ошибочно' $ .when() ' – thedarklord47

+0

@ thedarklord47 Спасибо, что указали это. Я ошибся в '' '. Также OP уже использует AJAX здесь. Поэтому я подумал, что это было тривиально :) –

+0

^согласился, поэтому путаница при отсутствии синтаксиса 'jQuery.Deferred' haha. upvoted – thedarklord47

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

Обещания и асинхронный/ожидание помогает с такими вещами, как это.

+1

Работал как очарование! Думаю, я наконец понял, для чего нужны обещания! :) Я много слышал об этом, но всегда избегал использовать его, потому что я не получил их хорошо. Большое спасибо Джесси! Ура! – Newbie

Смежные вопросы