基于同步承诺的方法?

时间:2016-08-10 13:14:15

标签: javascript node.js

我试图让一些对象的方法,有一个基于promise的函数调用内部同步工作。

例如,在这里,我们有一个worker对象。它有一些原型方法,可以调用基于promise的函数。出于测试目的,我创建了一个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 finished.
2 finished.
1 finished.

..因为所有3个方法都是立即执行的,输出取决于超时。

现在的想法是重写job1job2job3函数,以便它们变得同步,结果我得到:

1 finished
2 finished
3 finished

现在使用类似async.mapSeries之类的解决方案不是变体,因为我不必逐个运行3个方法 - 相反,我最终会在程序中运行一些需要运行的复杂逻辑重新运行不同的工作,我需要确保每个工作同步执行,以避免最终程序中的回调地狱和意大利面条代码。

如果重要的话,最终的程序环境将是node.js。没有巴贝尔。

注意也许cocoroutines可能是一个解决方案?看起来很有希望。

1 个答案:

答案 0 :(得分:-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();