2014-10-16 4 views
0

Я не могу понять, почему это не решение, какие-либо идеи? «разрешить это» делает печать, но она никогда не возвращает ее к разрешению обещания в. then.

var promise = wait(); 
promise.then(function(result){ 
    console.log("wait returned - " + result); 
}); 

function wait(){ 
    var deferred = $q.defer(); 
    if(busy){ 
     setTimeout(function(){ 
      wait(); 
     },500); 
    } else { 
     console.log("resolve this"); 
     deferred.resolve("Wait is over."); 
    } 
return deferred.promise; 
}; 
+0

Что изменилось «занято»? Во всяком случае, вы всегда создаете новый отложенный объект с каждым последующим вызовом 'wait', но возвращаете только один из первого вызова, по-видимому. – raina77ow

+0

вы возвращаете разные обещания каждый раз, когда вы вызываете 'wait' – akonsu

+0

Занят - это всего лишь флаг, установленный где-то в другом месте. Я не думал об этом, создавая это обещание каждый раз ... duh. Благодарю. – mrshickadance

ответ

1

Вот как это можно сделать вместо этого:

var promise = wait(); 
promise.then(function(result){ 
    console.log("wait returned - " + result); 
}); 

function wait(){ 
    var deferred = $q.defer(); 
    (function _wait() { 
    if (busy) { 
     setTimeout(_wait, 500); 
    } else { 
     console.log("resolve this"); 
     deferred.resolve("Wait is over."); 
    } 
    })(); 
    return deferred.promise; 
}; 

Основное различие заключается в том, что там будет только один deferred, создается и возвращается функцией «обертке». Это отсрочка будет в конечном итоге разрешена функцией _wait.

В вашем случае каждый последующий вызов (рекурсивный) wait() создает другой объект deferred. Один из этих объектов будет в конечном итоге разрешен, правильно - но это будет тот же объект, который был возвращен первым вызовом wait(), только если busy будет ложным в данный момент. По-видимому, большую часть времени это не будет.

1

Каждый раз, когда вы вызываете wait, он делает новый обещанием. Звонки на wait внутри вашей функции setTimeout ничего не делают с созданием первого обещания. Попробуйте вместо этого:

var promise = wait(); 
promise.then(function(result){ 
    console.log("wait returned - " + result); 
}); 

function wait(){ 
    var deferred = $q.defer(); 
    var timer = setInterval(function() { 
     if(!busy) { 
      clearInterval(timer); 
      console.log("resolve this"); 
      deferred.resolve("Wait is over."); 
     } 
    }, 500); 
    return deferred.promise; 
}; 

Кроме того, в зависимости от того, как устроен остальной части вашей программы, это может быть хорошей идеей, чтобы разрешить обещание как толькоbusy становятся true; то вам не придется ждать так долго.

Смежные вопросы