2017-12-06 4 views
3

Ich habe einen Ereignis-Listener, der das Ereignis (vom Server) erhält, wenn eine bestimmte Aufgabe erledigt ist. Ich möchte, dass jede Aufgabe in ein Versprechen eingebettet wird, damit ich komplexe geordnete Arbeitsabläufe auf eine saubere Art und Weise konstruieren kann.Wie löse ich einzelne Versprechen von einem zentralisierten Listener aus?

Wie würde ich jedes Aufgabenversprechen (nach ID) von einem globalen Listener lösen? Hier ist ein konzeptionelles Beispiel für das, was ich erreichen möchte.

// list of all tasks 
var tasks = {} 
tasks['id-1'] = getTask('id-1') 
tasks['id-2'] = getTask('id-2') 

// do task in order 
// each task will issue request to server, and wait for reply 
tasks['id-1'].startPromise() 
    .then(function(result) { 

    // start second task from first task's data 
    return tasks['id-2'].startPromise(result); 
    }) 
    .then(function() { 
    // finalized task works 
    return true; 
    }); 


// listen to task finish 
client.listen('onReceive', function(event) { 
    if(event.is('taskFinished')) { 
    var id = event.taskId; 
    tasks[id].resolve(event.result); //How do I resolve task from listener?? 
    } 
}); 
+0

Ich sehe nicht, was das mit Polling zu tun hat. – Bergi

Antwort

3

Ja, Sie würden eine globale Zuordnung von IDs zu Resolver-Funktionen benötigen.

const tasks = new Map; 
function runTask(id, data) { 
    return new Promise(resolve => { 
     tasks.set(id, resolve); 
     client.fire('start', id, data); // or whatever you need to trigger the task 
    }) 
} 
client.on('taskFinished', event => { // or however you get notified of finished tasks 
    const id = event.taskId; 
    if (tasks.has(id)) { 
     tasks.get(id)(event.result); 
     tasks.delete(id); 
    } 
}); 

Sie können auch ein einfaches Objekt anstelle des ES6 Map verwenden, wenn Sie bevorzugen (oder müssen ES5-Kompatibilität), und Sie können den Hörer schreiben, so dass es nur dann aktiv ist, wenn die Zuordnung nicht leer ist.

Sie würden diese verwenden wie

runTask('id-1').then(result => 
    runTask('id-2', result) 
).then(() => { 
    console.log("both done"); 
    return true; 
}) 
+0

Danke für die Antwort, ich wusste nicht, dass Sie Funktion nur auf das Versprechen, es zu lösen, anrufen können. – pbeta

+0

Ich rufe nichts auf das Versprechen, ich rufe die 'Entschlossenheit'-Funktion – Bergi

Verwandte Themen