Warum ist mein Versprechen der Rückgabe undefiniert?
Hintergrund
Ich versuche, eine Funktion, die verzögert die Ausführung von asynchronen Funktionen von X ms.
Für die Zwecke dieser demonstration, die folgende ist die async-Funktion, die nimmt eine URL:
/*
* This is a simulation of an async function. Be imaginative!
*/
let asyncMock = function(url) {
return new Promise(fulfil => {
setTimeout(() => {
fulfil({
url,
data: "banana"
});
}, 10000);
});
};
Ziel
Mein Ziel ist dabei eine Funktion, die die url
argument asyncMock
und dann rufen Sie alle X ms, oder bis es keine Argumente mehr, die linke.
Grundsätzlich möchte ich jeden Aufruf von asyncMock
getrennt werden von X ms.
Stellen Sie sich als Beispiel nenne ich asyncMock
20 mal in Folge. Normalerweise werden diese 20 Anrufe würden sofort erledigt werden. Was ich will, um sicherzustellen, dass es ist Xms Verzögerung zwischen jedem der 20 Anrufe.
Vorläufige
Meine Idee um dies zu lösen, ist eine Fabrik haben, zurückgeben, ein Versprechen, führen Sie die Funktion nach X ms.
let throttleFactory = function(args) {
let {
throttleMs
} = args;
let promise = Promise.resolve();
let throttleAsync = function(url) {
return promise.then(() => {
setTimeout(anUrl => {
return new Promise( fulfil => {
fulfil(asyncMock(anUrl));
});
}, throttleMs, url);
});
};
return Object.freeze({
throttleAsync
});
};
Ideal ich würde dieses Werk wie im Beispiel unten:
let throttleFuns = throttleFactory({
throttleMs: 2000
});
console.log('running');
throttleFuns.throttleAsync('http://www.bananas.pt')
.then(console.log)
.catch(console.error);
throttleFuns.throttleAsync('http://www.fruits.es')
.then(console.log)
.catch(console.error);
throttleFuns.throttleAsync('http://www.veggies.com')
.then(console.log)
.catch(console.error);
//a ton of other calls in random places in code
Problem
Hier das problem, dass mein throttleAsync
Funktion Ausgänge undefined
dreimal sofort. Ich glaube, das könnte sein, weil ich bin nicht der Definition promise
richtig.
Frage
Wie kann ich das beheben dieser code funktioniert wie gedacht?
Ok, also vielleicht sollte ich die Beschreibung ändern? Ich bin auf es.
Aktualisiert die Beschreibung, danke für das feedback!
InformationsquelleAutor Flame_Phoenix | 2017-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist dein problem:
Was Sie hier tun, ist, Sie wieder ein Versprechen aus der setTimeout-Rückruf. Der Rückgabewert der Funktionen von setTimeout ignoriert werden, so wird niemand bekommen, der Wert.
setTimeout
werden nicht ignoriert?Sie werden immer ignoriert. Anstatt ein neues Versprechen in setTimeout müssen Sie lösen ein Versprechen, das wird schon wieder irgendwo anders, wo es nicht ignoriert.
InformationsquelleAutor rsp