2017-06-12 4 views
5

Ich habe ein Eingabefeld. Nachdem der Benutzer die Eingabe beendet hat, möchte ich eine HTTP-Anfrage durchführen und auf die Ergebnisse warten.Wie kann ich mit async/abwarten entprellen?

Here's a jsbin

Da Netzwerk-Anfragen nicht auf jsbin erlaubt sind, habe ich setTimeout() stattdessen verwendet.

var log = console.log.bind(console) 

var delayedResults = new Promise(function(resolve) { 
    setTimeout(function(){ 
    resolve('Wooo I am the result!') 
    }, 3000); 
}); 

document.querySelector('input').addEventListener('input', _.debounce(async function(){ 
    log('Doing search') 
    var result = await delayedResults 
    log('Result is', result) 
}), 500); 

Jedoch, wenn ich in das Feld eingeben, ‚Suche Doing‘ erscheint sofort jedes Zeichen - ich will es nur erscheinen, nachdem die 500 ms abgelaufen ist.

Wie kann ich Entprellen und warten?

Antwort

5

Das Problem war in der letzten Zeile:

}), 500); 

Sie sollten debounce Funktionsaufruf schließen nach der Zeit-Argument angegeben wurde:

}, 500)); 

var log = console.log.bind(console) 
 

 
    var delayedResults = new Promise(function(resolve) { 
 
    setTimeout(function(){ 
 
     resolve('Wooo I am the result!') 
 
    }, 3000); 
 
    }); 
 

 
    document.querySelector('input').addEventListener('keydown', _.debounce(async function(){ 
 
    log('Doing search') 
 
    var result = await delayedResults; 
 
    log('Result is', result) 
 
    }, 500));
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script> 
 
<input>

+1

Ooh subtil! Ich glaube, es ist an Linting vorbeigegangen, also habe ich es nicht bemerkt. Vielen Dank! – mikemaccana

Verwandte Themen