Как я могу получить javascript для обслуживания очереди событий в узле

У меня есть функция, которая должна ждать, пока обещание не будет разрешено, прежде чем возвращать значение. К сожалению, простое использование цикла 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);

person Dr.Knowitall    schedule 24.05.2014    source источник


Ответы (1)


Обещания продолжаются с .then примерно так же, как обычный синхронный код продолжается с ;

Итак, чтобы дождаться разрешения промиса, вы не делаете while(promiseNotResolved), вместо этого вы делаете:

promise().then(function(value){
    //code that runs once the promise is resolved
});
person Benjamin Gruenbaum    schedule 24.05.2014
comment
Ладно, думаю, тогда мне придется изменить свою стратегию. Спасибо. - person Dr.Knowitall; 24.05.2014
comment
@Mr.Student также обратите внимание, что вам не следует самостоятельно реализовывать цепочку, это то, что делает .then, и рассмотрите возможность обещания этой функции h. - person Benjamin Gruenbaum; 24.05.2014
comment
Трудность, стоящая за этой проблемой, которую я пытаюсь решить, заключается в том, что я не могу позволить себе роскошь работать с промисами. Я работаю с кодом, который использует обратные вызовы для синхронизации, и я надеялся создать что-то, чтобы легко связать его вместе без ада обратных вызовов. Я могу использовать промисы в своей библиотеке, но не могу предположить, что они будут. - person Dr.Knowitall; 24.05.2014
comment
@Mr.Student, обещающий API или нодифицирующий его, тривиален с такими библиотеками, как Bluebird. Вам больше не нужно ничего предполагать :) - person Benjamin Gruenbaum; 24.05.2014