Sto tentando di eseguire una suite di test per un oggetto che restituisce una promessa. Voglio concatenare diverse azioni insieme a brevi timeout tra di loro. Ho pensato che un "quindi" call che ha restituito una promessa avrebbe aspettato che la promessa si fosse adempiuta prima di sparare alla successiva incatenata chiamata.Come si fa a impostare setTimeout in una promessa
ho creato una funzione
function promiseTimeout (time) {
return new Promise(function(resolve,reject){
setTimeout(function(){resolve(time);},time);
});
};
per cercare di avvolgere setTimeout in una promessa.
Poi nella mia suite di test, io chiamo qualcosa di simile ...
it('should restore state when browser back button is used',function(done){
r.domOK().then(function(){
xh.fire('akc-route-change','/user/4/profile/new');
}).then(promiseTimeout(2000)).then(function(t){
xu.fire('akc-route-change','/user/6');
}).then(promiseTimeout(10)).then(function(t){
expect(xu.params[0]).to.equal(6);
history.back();
}).then(promiseTimeout(10)).then(function(){
expect(xu.params[0]).to.equal(4);
done();
});
});
posso mettere un punto di interruzione sulla prima xh.fire
chiamata e un secondo sulla chiamata xu.fire
e sarebbe aspettato due secondo spazio quando continua dal primo punto di interruzione al secondo.
Invece raggiunge immediatamente il secondo punto di interruzione e il valore di t
in quel punto non è definito.
Cosa sto sbagliando?
Quello che stai facendo è simile a 'setTimeout (fn(), 1000) 'invece di' setTimeout (fn, 1000) ', ciò che' then' takes è una funzione che restituisce una promessa e non una promessa. –
Inoltre, puoi 'return' promette da' it', non c'è bisogno di usare 'done' –
Non capisco cosa intendi Ho appena cambiato la chiamata setTimout a' setTimeout (risoluzione, ora, tempo); 'ma ciò non non cambiare nulla – akc42