私は、ユーザがそれを押したときに追跡したいボタンを持っており、追跡ajaxコールがデータを返す場合は約束を実行し、すべて完了したらボタンイベントを続行します。ネストされた約束関数
以下は私がこれまで持っていたものですが、ボタンイベントと第2の約束は同時に発生します。ボタンイベントが待っていないAJAXはハロー警告し、その後、質問を返さない場合は第二約束は解決するために
- クリックボタン
- AJAX呼び出しがイベント
- を記録します。
- AJAX呼び出しで質問が返された場合は、モーダルを閉じてモーダルを開いてから、helloを呼び出します。
$('.my_button').on('click', function() {
ui_tracking('button_1').then(function() {
alert('Hello');
});
});
function ui_tracking(type, payload) {
var deferred = $.Deferred();
var log_action = function() {
$.ajax({
url: '/api/submit_action',
type: 'POST',
dataType: 'json',
data: {
type: type,
payload: JSON.stringify(payload)
},
success: function(results, textStatus, xhr) {
if (typeof(results) !== 'undefined' && results !== null) {
if (typeof(results.data) !== 'undefined' && results.data !== null) {
if (results.data.question) {
startQuestion(results.data.question).then(function() {
deferred.resolve();
}, function() {
deferred.reject();
});
}
}
}
deferred.resolve();
},
error: function (xhr, textStatus, errorThrown) {
deferred.reject();
}
});
};
log_action();
return deferred.promise();
}
function startQuestion(question_data) {
var deferred = $.Deferred();
var openQuestion = function() {
$('#question-modal .modal-body .question').html(question_data.question).attr('data-question-id', question_data.id);
$('#question-modal').modal('show').on('hidden.bs.modal', function (e) {
deferred.resolve();
$('#question-modal').unbind('hidden.bs.modal');
});
};
openQuestion();
return deferred.promise();
}
SF
私はあなたがjavascriptの[Promise.all](HTTPSが必要だと思う:// developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)の機能です。 –
@PabloDarde - 約束が一連のものであるように、Promise.allは役に立たない。 –