У меня есть функция, которая должна ждать, пока обещание не будет разрешено, прежде чем возвращать значение. К сожалению, простое использование цикла while и проверка того, разрешено ли обещание, перегружает поток и не позволяет моей функции setTimeout выполнить свой обратный вызов. Единственное решение, которое я могу придумать, - это сообщить js об обслуживании очереди событий, если мое d.promise не было разрешено как true. Ниже мой код:
var _ = require('lodash');
var Q = require('q');
var h = function(x,y,z, callback) {
setTimeout(function(){
// This never logs to my terminal
console.log(x + y + z);
callback();
}, 1000);
};
var b = function(x,y,z, callback) {
console.log(x * y * z);
callback();
};
chain = function(args, f) {
var index;
if( (index = _.indexOf(args,'cb')) < 0 ) {
f.apply(null,args);
} else {
return {
chain: function(newArgs, fxn) {
var d = Q.defer();
args[index] = function() {
d.resolve(true);
};
f.apply(null,args);
// Don't return until callback is resolved.
while(d.promise.valueOf() != true){
// Since the thread is hogged by this loop, I'd like
// to tell it to manually service my event/function queue
// so that setTimeout works while this loop polls.
// This setTimeout will never execute the callback
setTimeout(function(){console.log('hi');},5);
};
return chain(newArgs, fxn);
}
}
}
}
chain([2,2,3,'cb'], h ).
chain([2,5,3, 'cb'], b).
chain([2,1,3,'cb'], h ).
chain([2,2,5, 'cb'], b).
chain([6,6,6, function() {console.log('ok');}], b);