2012-09-17 11 views
8

Bazı sorunları (https://github.com/kriskowal/q) bir javascript için kütüphane vaat: ...Geri arama zincirini q ile nasıl yaparım? "Q" nasıl kullanılacağını anlamaya

var delayOne = function() { 
    setTimeout(function() { 
     return 'hi'; 
    }, 100); 
}; 

var delayTwo = function(preValue) { 
    setTimeout(function() { 
     return preValue + ' my name'; 
    }, 200); 
}; 

var delayThree = function(preValue) { 
    setTimeout(function() { 
     return preValue + ' is bodo'; 
    }, 300); 
}; 

var delayFour = function(preValue) { 
    setTimeout(function() { 
     console.log(preValue); 
    }, 400); 

}; 

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).end(); 

bu sadece döner tanımsız

cevap

9

Eğer "tanımsız" olsun nedeni zincirleme olan işlevler şey dönen değil çünkü:

var delayOne = function() { 
    setTimeout(function() { 
    return 'hi'; 
    }, 100); 
}; 

delayOne aramaları setTimeout ve hiçbir şey (undefined) döndürür. wroniasty belirttiği gibi

var delayOne = function() { 
    var d = Q.defer();  
    setTimeout(function() { 
    d.resolve("HELLO"); 
    }, 100); 
    return d.promise; 
}; 

var delayTwo = function(preValue) { 
    setTimeout(function() { 
    alert(preValue); 
    }, 
    400); 
}; 

delayOne().then (delayTwo); 

http://jsfiddle.net/uzJrs/2/

+0

çözüm için teşekkür ederiz. Bunun yanısıra, Q kullanırsam, kod kalitesini çok daha iyi bir hale getirecek bir karar almam gerekir. Bu problemin tecrübesi var mı? – bodokaiser

+1

çok sayıda zincirleme, uyumsuz çağrı kullanırsanız, 'Doom Piramidi'nden kaçmak için kütüphaneye ihtiyacın olacak :). Şahsen asyncjs tercih ediyorum: https://github.com/caolan/async, ve bazı orta ölçekli projelerde başarı ile kullandım. – wroniasty

12

, o fonksiyonların her birinden bir söz dönmek gerekir, ancak herhangi bir geri arama odaklı soyut da yapmalıdır:

hedefe ulaşmak için, Q.defer kullanmalıdır API'lar (setTimeout gibi) mümkün olduğu kadar çok ve yerine söz veren API'leri kullanın. setTimeout durumunda

Q zaten setTimeout değiştirilmesi için milisaniye cinsinden belirtilen sonra çözülecektir bir söz verir Q.delay(ms), mükemmel sağlamaktadır:

var delayOne = function() { 
    return Q.delay(100).then(function() { 
     return 'hi'; 
    }); 
}; 

var delayTwo = function(preValue) { 
    return Q.delay(200).then(function() { 
     return preValue + ' my name'; 
    }); 
}; 

var delayThree = function(preValue) { 
    return Q.delay(300).then(function() { 
     return preValue + ' is bodo'; 
    }); 
}; 

var delayFour = function(preValue) { 
    return Q.delay(400).then(function() { 
     console.log(preValue); 
    }); 
}; 

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).done(); 

(not: enddone ile değiştirilmiştir

İlgili konular