Soru JavaScript Stili: isteğe bağlı geri aramalar


Ben her zaman değil bir geri arama çalıştırmak isteyeceğim bazı işlevleri var, geri çağrı tanımlanmış / işlev iyi bir stil olup olmadığını kontrol etmek veya daha iyi bir yolu var mı?

örnek:

function save (callback){
.....do stuff......
   if(typeof callback !== 'undefined'){
     callback();
   };
};

76
2017-07-22 15:56


Menşei


modern tarayıcılarda sadece kullanabilirsiniz typeof callback !== undefined öyleyse ' - Snickbrack
ve eğer sadece çağırırsanız save()? Bir argüman eksik olduğu için bu bir hata veya işaretleme uyarısı vermeyecek mi? Ya da tamamen mükemmel ve geri arama sadece undefined ? - João Pimentel Ferreira


Cevaplar:


Ben şahsen tercih ederim

typeof callback === 'function' && callback();

typeof Komut, ancak tehlikeli ve sadece için kullanılmalıdır "undefined" ve "function"

İle ilgili sorunlar typeof !== undefined kullanıcı tanımlanmış bir değerden geçebilir ve bir işlev değil


113
2017-07-22 15:58



typeof tehlikeli değil Zaman zaman muğlak, ama ona tehlikeli diyemezdim. Yine de, geri arama işlevini bir işlev olarak çağırırsanız, bunun aslında bir işlev olduğunu ve bilmeniz gereken bir sayı olduğunu kontrol etmeniz en iyisidir. :-) - T.J. Crowder
@ T.J.Crowder tehlikeli yanlış kelime olabilir, iyi tanımlanmış ama boks ve geri dönüş nedeniyle işe yaramaz "object" Zamanın% 95'i. - Raynos
typeof boksa neden olmaz. typeof "foo" olduğu "string", değil "object". Aslında bir dize ilkeliyle mi uğraştığınızı veya söyleyebildiğiniz tek gerçek yoldur. String nesne. (Belki de Object.prototype.toString, hangisi çok kullanışlıama boksa sebep oluyor. - T.J. Crowder
Harika bir şekilde deyimsel kullanımı && bu arada. - T.J. Crowder
@ T.J.Crowder Bir noktanız var, string ilkel ve kutulu String nesnelerini karşılaştırmanın değerinin ne olduğunu bilmiyorum. Ayrıca katılıyorum .toStringbulmak için güzel [[Class]]. - Raynos


Ayrıca şunları da yapabilirsiniz:

var noop = function(){}; // do nothing.

function save (callback){
   callback = callback || noop;
   .....do stuff......
};

Kullanmak için özellikle yararlıdır callback birkaç yerde.

Ayrıca kullanıyorsanız jQuery, zaten böyle bir işleve sahipsin, denir $ .noop


41
2017-07-22 15:59



Benim görüşüme göre, bu en şık çözüm. - Nicolas Le Thierry d'Ennequin
Kabul. Bu aynı zamanda testi daha kolay hale getirir, çünkü şartsız bir durum yoktur.
Bu, en çok oylanan öneri imho'dan daha zariftir. - mefiX
ama bu tip meseleyi ele almıyor değil mi? ya bir dizi geçirirsem? veya bir String? - Zerho
İçin basitleştir callback = callback || function(){}; - NorCalKnockOut


Sadece yapmak

if (callback) callback();

Ne tür olursa olsun, tedarik edilirse geri aramayı tercih ederim. Sessizce başarısız olmasına izin vermeyin, bu yüzden uygulayıcı yanlış bir argümandan geçtiğini bilir ve onu düzeltebilir.


27
2018-03-31 11:16



Bu çözümü sevdim, basit ve iyi çalışıyor. - Domenico Monaco


Pablo'nun söylediklerine ek olarak, en son ECMAScript'te bu geçerli:

// @param callback Default value is a noop fn.
const wow = (callback = ()=>{}) => {
   callback();
};

Bir kullanıcının bir işlevden başka bir şey iletebileceğini ve kırılacağını lütfen unutmayın.


2
2017-12-20 13:20





Geri arama işlemini yürütmek için kriterler tanımlanmış olsun ya da olmasın, sorun değil. Ayrıca, gerçekten ek olarak bir işlev olup olmadığını kontrol etmenizi öneririz.


0
2017-07-22 15:59





Aynı parçacığı görmekten çok yoruldum ve bunu yazdım:

  var cb = function(g) {
    if (g) {
      var args = Array.prototype.slice.call(arguments); 
      args.shift(); 
      g.apply(null, args); 
    }
  };

Yüzlerce fonksiyon gibi şeyler yapıyorum

  cb(callback, { error : null }, [0, 3, 5], true);

ya da her neyse...

Ben tüm "eminim ki bu fonksiyonun" stratejisini şüpheliyim. Tek meşru değerler bir işlev ya da falsi. Birisi sıfır olmayan bir sayı veya boş olmayan bir dizeden geçerse, ne yapacaksınız? Problemi görmezden gelmek nasıl çözer?


0
2017-07-22 16:24



İşlev, ilk argüman olarak bir değer, ilk argüman olarak işlev veya her iki parametreyi kabul etmek için aşırı yüklenmiş olabilir. Bir fonksiyon olup olmadığını kontrol etmek için bir kullanım durumu var. Ayrıca yanlış bir parametreyi yok saymak ve daha sonra bir işlev yürütmek için bir hata atmak daha iyidir - Raynos
@Raynos - Bu çok, çok özel bir kullanım çantası. JavaScript, zayıf yazıldığından türlerini ayırt etmede iyi değildir ve genellikle, türleri ayırt etmeye ve arayanın ne istediğini tahmin etmeye çalışmaktan ziyade, adlandırılmış parametrelerden geçmek daha iyidir: save( { callback : confirmProfileSaved, priority: "low" }) - Malvolio
Katılmıyorum, yeterli tip kontrol yeteneği var. Yöntem aşırı yüklemeyi tercih ederim, ama bu kişisel tercih. Bu jQuery'nin çok şey yapması gibi bir şey. - Raynos
@Raynos - Bu daha da kötüsü Yanlış parametreyi yok saymak için bir işlev yürütmek için bir hata atmak. Tipik bir durum düşünün: kütüphane işlevi bazı senkronize olmayan etkinlikleri gerçekleştiriyor ve arama fonksiyonunun bildirilmesi gerekiyor. Dolayısıyla, görmezden gelmeyen bir kullanıcı, görmezden gelmek ve başarısız olmakla aynı gibi görünür: etkinlik asla tamamlanmamış gibi görünür. Ancak, karmaşık bir kullanıcıya (örneğin, orijinal programcıya), bir hata, bir hata mesajı ve doğrudan soruna işaret eden bir yığın izi verir; parametrenin yok sayılması, "hiçbir şeyin" neyin meydana geldiğini belirlemek için sıkıcı analiz anlamına gelir. - Malvolio
Olsa da bir takas var. Bir hatayı atmak, çalışma zamanını bozar, ancak göz ardı etmek, etrafındaki diğer kodların normal çalışmasına izin verir. - Raynos


Günah işledim kahve-script ve varsayılan argümanlar bulundu bu sorunu çözmek için iyi bir yoldur

doSomething = (arg1, arg2, callback = ()->)->
    callback()

0
2018-03-14 13:19





Kolaylıkla yapılabilir ArgueJS:

function save (){
  arguments = __({callback: [Function]})
.....do stuff......
  if(arguments.callback){
    callback();
  };
};

0
2018-04-12 16:41





Geçerli bir işlev İşlev prototipini temel alır, aşağıdakileri kullanın:

if (callback instanceof Function)

geriçağırımın bir işlev olduğundan emin olmak için


0
2017-12-26 18:36