私はいくつかのオブジェクトのメソッドは、その中で約束ベースの関数呼び出しが同期的に働いているようにしています。同期的な約束事に基づく方法?
ここでは、たとえば、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.
が直ちに実行され、出力がタイムアウトに依存しています。
今アイデアは、彼らは同期になり、その結果に私を得るようjob1
、job2
とjob3
機能を書き換えることである:私はので
1 finished
2 finished
3 finished
は今async.mapSeries
のようなものを使用するためのソリューションは、バリアントではありません3つのメソッドを1つずつ実行する必要はありません。代わりに、最終的には、異なるジョブを実行して再実行する必要のある複雑なロジックがプログラムに含まれていて、コールバック地獄とスパゲッティコードを避けるために、最終的なプログラム。
重要な場合、最終的なプログラム環境はnode.jsになります。バベルはありません。
注おそらくcoまたはcoroutinesが解決策になりますか?非常に有望に見えます。
プロミスは本質的に非同期なので、同期して実行することはできません。あなたがしたいことは、それらを順番に実行することです。その場合、おそらく 'co'が(async/awaitとして、ノードではまだ利用できません)最良の解決策です。 – nils
"これは、job1、job2、job3の関数を同期させるように書き直したものです。"あなたの関数が本質的に非同期であると言っても、それを同期させることもできないはずもない。 –
彼らは内部で(他のライブラリからのメソッドの約束に基づく呼び出し)約束を持っているので、今は非同期です。アイデアは、同期メソッドに必要な機能をラップすることです。 – kaytrance