問題是這些回調函數是異步調用的,其中的return
語句返回的值在以後不能使用。如果整個過程是同步下面的結構只會工作:
var ret = Alertify.alert({
content: 'This is MY alert content!'
});
...但Alertify.alert()
不會返回所需的值,因爲用戶還未點擊。這個alert()
函數不會返回任何東西,並且肯定不會返回仍然必須發生的點擊結果。
此場景對於引入承諾是理想的。這是它的外觀,當你做到這一點:
首先改變showModal
函數返回一個承諾:
var showModal = function (alert_id) {
$('body').append($html);
var $modal = $('#' + alert_id);
$modal.modal('show');
var dfd = $.Deferred(); // create a promise
$modal.on('click', '[data-alertify="cancel"]', function(){
var value = 'no';
$modal.modal('hide');
dfd.resolve(value); // instead of returning the value, resolve the promise with it
});
$modal.on('click', '[data-alertify="confirm"]', function(){
var value = 'yes';
$modal.modal('hide');
dfd.resolve(value);
});
$modal.on('hidden.bs.modal', function(){
$(this).remove();
dfd.resolve();
});
return dfd.promise(); // return the (unresolved) promise
};
現在Alertify.alert
會返回一個承諾對象,它公開了一個then
方法,給你傳遞迴撥:
Alertify.alert({
content: 'This is MY alert content!'
}).then(function(ret) {
alert(ret);
});
......就是這樣。
這裏是更新的fiddle。
爲什麼「on」回調異步調用? – KAD
因爲它們是由用戶點擊觸發的,而這發生在代碼已經完成運行時。 – trincot
我知道我必須處理承諾,我只是在猜測是否有另一種方式。是否有可能將該值返回給變量,而不使用'$ .then()'?例如'var ret_value = Alertify.prompt(.....);'以便我的代碼看起來更乾淨? – Yuri