2016-03-04 6 views
0

Мне нужно протестировать REDIS (который работает асинхронно), если значение установлено или нет, прежде чем разрешить запуск моего кода.Пока цикл в обещании до тех пор, пока не закончится другое обещание

Я начал работать с Loop Promise, как определено здесь: https://stackoverflow.com/a/17238793/3912805

Я попытался это, но, к сожалению, я застрял с обещанием в ожидании:

promise: { state: 'pending' }

function promiseWhile(condition, body) { 
    var done = Q.defer(); 

    function loop() { 
     /** When the result of calling condition is no longer true, we are done */ 
     if(!condition()) 
      return done.resolve(); 
     /** Use 'when', in case `body` does not return a promise */ 
     /** When it completes loop again otherwise, if it fails, reject the done promise */ 
     Q.when(body(), loop, done.reject); 
    } 
    /** Start running the loop in the next tick so that this function is completely async */ 
    /** It would be unexpected if body was called synchronously the first time */ 
    Q.nextTick(loop); 
    return done.promise; 
} 

var timeline_id = 3;  
promiseWhile(function() {   
    return Q.ninvoke(redisClient, 'hget', 'hashTest', timeline_id).then(function (result) { 
     console.log(result + '<---->'); 
     return result; 
    }); 
}, function() { 
    return Q.delay(500); 
}).then(function() { 
    // Let's continue process... 
}); 

I нужно проверить интервалы, вызывать, если timeline_id уже выполняется, мне нужно подождать. UNTIL timeline_id был удален в Redis из hashTest.

Как я могу быть уверен, что получил результат, а не обещаю, чтобы проверить, могу ли я еще запустить цикл или нет.

ответ

1

Наконец, я нашел способ для достижения этой цели ...

наверняка не очень элегантно, но я не могу сделать лучше сейчас:

var redisState = true; 
promiseWhile(function() { 
    /** Loop until true */ 
    return redisState; 
}, function (result) { 
    return Q.ninvoke(redisClient, 'HGET', 'hashTest', timeline_id).then(function(result) { 
     redisState = result; 
     if (redisState) { 
      redisState = result; 
      return Q.delay(500);     
     } 
    }); 
}).then(function() {  
... 
}): 
Смежные вопросы