2016-04-11 12 views
0

Bu kodu aldığımda, sonuçları çözümlenmiş veya reddedilmiş bir söz olarak iade edilmelidir.Kullanıcı girdisine bağlı olarak JQuery sözü nasıl çözülür

var runChecks = function(hasClickId, maxClicksModeIsNotOff) { 
    var dfd = $.Deferred(); 

    clickIdCheckPassed = hasClickId; // equals false 
    maxClicksCheckPassed = maxClicksModeIsNotOff; // equals false 

    if (!clickIdCheckPassed) { 
     clickIdCheckPassed = runClickIdCheck(); 
    } 

    if (!maxClicksCheckPassed) { 
     maxClicksCheckPassed = runMaxClicksCheck(); 
    } 

    if (maxClicksCheckPassed && clickIdCheckPassed) { 
     dfd.resolve('Resolved'); 
    } else { 
     dfd.reject('rejected'); 
    } 

    return dfd.promise(); 
}; 

Fonksiyonlar runClickIdCheck() ve üzerinde runMaxClicksCheck() toplamak kullanıcı girişi ve esaslı, true veya false ya dönüş.

if (maxClicksCheckPassed && clickIdCheckPassed) { 
    dfd.resolve('Resolved'); 
} else { 
    dfd.reject('Rejected'); 
} 

Ancak, sorun kodu kullanıcı girişi için beklemek olmamasıdır ve her seferinde değerlendirir: dolayısıyla koşullu - Her iki elde edilen değerler, true ise, ben aksi takdirde reddedilmelidir, sözünü çözmelidir Kullanıcı herhangi bir girdi vermeden önce 'reddedildi' sözünü verir. gibi runClickIdCheck işlevi nasıl göründüğünü Başvuru için

şudur ki: beklendiği gibi davranmasına Bu kodu yapabilirsiniz nasıl

var runClickIdCheck = function() { 
    bootbox.confirm('Are you sure?', function(result) { 
     if (result) { 
      return true; 
     } 
    }); 
    return false; 
}; 

Ben 'kararlılığı' olarak söz değerlendirmek, böylece sadece kullanıcı girişi bağımlı işlevleri her ikisi de doğru mu?

Düzenleme:

beklenen UI davranışı formu kullanıcı iki kez diyaloğu teyit yalnızca sunulmalıdır gerektiğidir:

$form.submit(function(e) { 
    e.preventDefault(); 
    $.when(runChecks(hasClickId, maxClicksModeIsNotOff)).then(
     function(status) { 
      $form.submit() 
     }, 
     function(status) { 
      return false; 
     } 
    ); 
} 

budur ben söz inteface yapacağını düşündü neden iş. runClickIdCheck() ve runMaxClicksCheck()true için değerlendirirse, söz veriyorum shoudl.

+0

Burada sözlerini kötüye kullandığınızı düşünüyorum. Çekiniz tamamen senkronize görünüyor, bu yüzden (mümkün olsa bile), sözel anlambilimine ayakkabı çekmek için gerçekten gerekli değil. Sadece çek çalıştır ve gerektiğinde çalıştır. Çözmeyi denediğiniz problem hakkında daha fazla bilgi verin, yani UI davranışını uygulamak için neler yapıyorsunuz? Ayrıca bunu gösteren gerekli işaretleme ekleyin. – Tomalak

+0

@Tomalak "runClickIdCheck" yöntemi eşzamansız gibi görünüyor. OP mantıksal olarak ilgili geri aramada ayarlamalı veya bu eklenti yöntemi (bilmediğim) vaat arayüzünü –

+0

@ A.Wolff Ah işlemek zorundadır, tabii ki doğru. – Tomalak

cevap

1

bu'u $.Deferred() ile çalışmak için mümkün olsa da, buna değeceğinden şüphe duyuyorum.

Aşağıdaki kodu yazmadan önce vaat temelli bir çözüm geliştirdim ve bootbox'un sunduğu geri çağırma temelli yaklaşımı kullanmaktan çok daha uzun ve çok daha net olduğu ortaya çıktı.

Bunu basit tutun.

$("#form").submit(function (e) { 
    var self = this; 

    e.preventDefault(); 

    bootbox.confirm('Question 1', function (confirmed1) { 
     if (!confirmed1) return; 

     bootbox.confirm('Question 2', function (confirmed2) { 
      if (!confirmed2) return; 

      $.post(self.action, $(self).serialize()).done(function (data) { 
       // Ajax post has finished successfully 
      }); 
     }); 
    }); 
}); 
İlgili konular