2012-09-17 20 views
8

I algunos problemas para entender cómo utilizar "q" (https://github.com/kriskowal/q) promete una biblioteca de javascript:¿Cómo hago una cadena de devolución de llamada con q?

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(); 

esto sólo devuelve undefined ...

Respuesta

9

El razón por la que se obtiene "indefinido" se debe a que las funciones está encadenando no están regresando nada:

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

delayOne llamadas setTimeout y no devuelve nada (undefined).

Para lograr su objetivo debe utilizar Q.defer:

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

gracias por la solución. A la par de eso, tengo que tomar la decisión si uso Q, lo que mejoraría mucho la calidad de mi código en el otro lado, resultaría en una fuerte dependencia. ¿Tienes experiencia si este problema? – bodokaiser

+1

si usa muchas llamadas asincrónicas encadenadas, entonces necesitará alguna biblioteca para escapar de la 'Pirámide del Destino' :). Personalmente prefiero asyncjs: https://github.com/caolan/async, y lo utilicé con éxito en algunos proyectos de tamaño mediano. – wroniasty

12

Como wroniasty señaló, es necesario devolver una promesa de cada una de esas funciones, pero también debe resumen orientado ninguna devolución de llamada APIs (como setTimeout) tanto como sea posible y use API que devuelven promesas en su lugar.

En el caso de setTimeout, Q ya proporciona Q.delay(ms) que devuelve una promesa que se resolverá después del número especificado de milisegundos, ideal para sustituir setTimeout:

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(); 

(nota: end se ha sustituido por done)

Cuestiones relacionadas