2017-12-06 9 views
3

私はイベントリスナーを持っています。イベントリスナーは、特定のタスクが完了するたびに(サーバーから)イベントを受け取ります。私は、それぞれのタスクを約束してカプセル化することを望んでいますので、複雑な順序付けされたワークフローをきれいに構築することができます。集中リスナーから個々の約束をどのように解決するのですか?

グローバルなリスナーから(idで)各タスクの約束をどのように解決するのですか? ここに私が達成しようとしているものの概念例があります。

// 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

のように、これを使用します。 – Bergi

答えて

3

はい、IDからリゾルバ関数へのグローバルマッピングが必要です。あなたが好む(またはES5の互換性を必要とする)場合は、代わりES6 Mapのプレーンなオブジェクトを使用することができ、およびマッピングが空でないときにのみアクティブになるように、あなたがリスナーを書くかもしれません

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); 
    } 
}); 

あなたは、私はこれがポーリングに関係しているか見ていない

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

答えをありがとう、私はあなたがそれを解決する約束の関数を呼び出すことができるか分からなかった。 – pbeta

+0

私は約束の上で何も呼んでいません、私は 'resolve'関数を呼び出しています – Bergi

関連する問題