2016-08-10 46 views
0

私はいくつかのオブジェクトのメソッドは、その中で約束ベースの関数呼び出しが同期的に働いているようにしています。同期的な約束事に基づく方法?

ここでは、たとえば、workerというオブジェクトがあります。それは、約束ベースの関数を呼び出すいくつかのプロトタイプのメソッドを持っています。テスト目的のために私は特定の時間の後にメッセージを出力する約束を返すDummyPromise関数を作成しました。

var Promise = require("promise"); 

var worker = function(param_a, param_b) { 
    this.param_a = param_a; 
    this.param_b = param_b; 
}; 

worker.prototype.job1 = function() { 
    DummyPromise(1, 5000); 
}; 

worker.prototype.job2 = function() { 
    DummyPromise(2, 3000); 
}; 

worker.prototype.job3 = function() { 
    DummyPromise(3, 1000); 
}; 

function DummyPromise(jobId, timeout) { 
    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      console.log(jobId, "finished."); 
     }, timeout); 
    }); 
} 

var w = new worker("aa", "bb"); 
w.job1(); 
w.job2(); 
w.job3(); 

それが出力するようである私は、コードを実行した場合のようなもの:すべての3つの方法..because

3 finished. 
2 finished. 
1 finished. 

が直ちに実行され、出力がタイムアウトに依存しています。

今アイデアは、彼らは同期になり、その結果に私を得るようjob1job2job3機能を書き換えることである:私はので

1 finished 
2 finished 
3 finished 

は今async.mapSeriesのようなものを使用するためのソリューションは、バリアントではありません3つのメソッドを1つずつ実行する必要はありません。代わりに、最終的には、異なるジョブを実行して再実行する必要のある複雑なロジックがプログラムに含まれていて、コールバック地獄とスパゲッティコードを避けるために、最終的なプログラム。

重要な場合、最終的なプログラム環境はnode.jsになります。バベルはありません。

おそらくcoまたはcoroutinesが解決策になりますか?非常に有望に見えます。

+1

プロミスは本質的に非同期なので、同期して実行することはできません。あなたがしたいことは、それらを順番に実行することです。その場合、おそらく 'co'が(async/awaitとして、ノードではまだ利用できません)最良の解決策です。 – nils

+1

"これは、job1、job2、job3の関数を同期させるように書き直したものです。"あなたの関数が本質的に非同期であると言っても、それを同期させることもできないはずもない。 –

+0

彼らは内部で(他のライブラリからのメソッドの約束に基づく呼び出し)約束を持っているので、今は非同期です。アイデアは、同期メソッドに必要な機能をラップすることです。 – kaytrance

答えて

0

まあ、私は見つけるために管理している唯一の良い解決策がhereからasync/awaitモジュールを使用することでした。

これは理想的です。

-1

約束を連鎖させることで、簡単にこれを行うことができます。

連鎖はどのように機能しますか? promise1は即時に実行され、promise2はpromise1などに依存します。コードがそれを説明することを願っています。

注:DummyPromiseのインターンが、いくつかの非同期/約束をしている場合、それらをチェーンすることができます!

var Promise = require("promise"); 

var worker = function(param_a, param_b) { 
    this.param_a = param_a; 
    this.param_b = param_b; 
    this.promise = Promise.resolve(); //Starting point, resolved promise 
}; 

worker.prototype.job1 = function() { 
    //chaining starts here 
    this.promise = this.promise.then(function() { 
     return DummyPromise(1, 5000); 
    }); 
}; 

worker.prototype.job2 = function() { 
    //now this promise is pending on result from previous one 
    this.promise = this.promise.then(function() { 
     return DummyPromise(2, 3000); 
    }); 
}; 

worker.prototype.job3 = function() { 
    this.promise = this.promise.then(function() { 
     return DummyPromise(3, 1000); 
    }); 
}; 

function DummyPromise(jobId, timeout) { 
    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      console.log(jobId, "finished."); 
      resolve(); 
     }, timeout); 
    }); 
} 

var w = new worker("aa", "bb"); 
w.job1(); 
w.job2(); 
w.job3(); 
+0

なぜ賛成投票ですか? – Oxi

+0

私はなぜdownvotedを知りたいですか? – kaytrance

関連する問題