2017-03-14 3 views
0

Ich muss eine Funktion 'Timer' erstellen, die ein Versprechen zurückgibt und ein Argument (Anzahl von Millisekunden) dauert. Das Versprechen sollte in der Argumentationszeit in den Zustand "erfüllt" gehen. Es funktioniert nicht mit Verzögerung von neuen Versprechen.Kann mir jemand helfen, Versprechungen zu bekommen?

function timer(del) { 
    return new Promise(function (resolve, reject) { 
     resolve(del); 
    }); 
    setTimeout(timer, del); 
}; 

timer(3000).then(function(val) { 
    console.log ('I\'m shown in ' + (val/1000) + ' seconds'); 
}); 
+0

Ihre 'timer' Funktion gibt den' Promise', bevor Sie 'nennen setTimeout'. – mcuenez

Antwort

0
function timer(del) { 
    return new Promise(function(resolve) { 
    setTimeout(function() { 
     resolve(); 
    }, del) 
    }); 
} 
2

Sie sind nicht vor der Lösung der Versprechen warten, bist du es sofort in das Versprechen Executor-Funktion zu tun. Die setTimeout ist auch tote Code, wegen der return davor; Wenn die Rückgabe nicht vorhanden wäre, würden Sie timer einrichten, um sich jedes Mal (nach einer Verzögerung) zu nennen, wenn es ausgeführt wird.

function timer(del) { 
    return new Promise(function(resolve, reject) { 
     resolve(del);  // <==== You're doing this right away 
    }); 
    // The following is dead code since you already `return`ed 
    setTimeout(timer, del); // <==== This would call `timer` later, setting up a repeat 
} 

Verwenden Sie stattdessen den Timer resolve aufzurufen:

function timer(del) { 
 
    return new Promise(function(resolve, reject) { 
 
    setTimeout(resolve, del, del); 
 
    }); 
 
} 
 
timer(3000).then(function(val) { 
 
    console.log('I\'m shown in ' + (val/1000) + ' seconds'); 
 
});


Side Hinweis: Diese Zeile

setTimeout(resolve, del, del); 

funktioniert mit jedem modernen Browser. Für ältere Browser, die keine Argumente über setTimeout unterstützt haben vorbei, dann würden Sie entweder tun:

setTimeout(resolve.bind(null, del), del); 

oder dieses:

setTimeout(function() { 
    resolve(del); 
}, del); 
Verwandte Themen