2017-02-28 70 views
1

我想基於Boostrap構建一類自定義警報。一切都還很年輕,但我遇到了一個問題。只有發生點擊事件時,我如何才能根據點擊的按鈕返回值?在這裏你可以看到我是如何設置的值(很容易,做檢查)來自類函數的返回值

$modal.on('click', '[data-alertify="cancel"]', function(){ 
     var value = 'no'; 
     $modal.modal('hide'); 
     return value; 
    }); 
    $modal.on('click', '[data-alertify="confirm"]', function(){ 
     var value = 'yes'; 
     $modal.modal('hide'); 
     return value; 
    }); 

這裏是我的類和測試代碼JSFiddle

正如你可以看到,出現警告(顯然)之前的模式是所示。我該如何處理?我如何等待正確的值被返回,然後提醒它?

回答

2

問題是這些回調函數是異步調用的,其中的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

+0

爲什麼「on」回調異步調用? – KAD

+0

因爲它們是由用戶點擊觸發的,而這發生在代碼已經完成運行時。 – trincot

+0

我知道我必須處理承諾,我只是在猜測是否有另一種方式。是否有可能將該值返回給變量,而不使用'$ .then()'?例如'var ret_value = Alertify.prompt(.....);'以便我的代碼看起來更乾淨? – Yuri