使用JS promises / generator来实现简单的信号量

时间:2015-01-27 15:34:50

标签: javascript node.js promise generator semaphore

我正在尝试使用NodeJS只允许两个任务同时访问一段代码(这可能是例如访问API,但下面使用yield wait(2000)模拟。我正在使用{{ 1}}包使其适用于生成器和承诺而不是回调,但下面的代码只允许一次1而不是2来访问coyield semPromise(sem)之间的代码。

信号量包是NodeJS的一个(https://www.npmjs.com/package/semaphore),并且有一个sem.leave()take函数可以进入和离开受保护的代码部分。

我正在尝试下面的ES6 Promises。

leave

但如果我更换

var sem = require('semaphore')(2);

function wait(millis) {
    return new Promise(function(resolve, reject) {
        setTimeout(function(){resolve()}, millis);
    });
}

function semPromise(sem) {
    return new Promise(function(resolve, reject) {
        sem.take(function() {
            resolve();
        });
    });
}

co(function *main() {
    for (var i=0; i<10; ++i) {
        yield semPromise(sem);
        console.log('enter' + i);
        yield wait(2000);
        console.log('done' + i);
        sem.leave();
    }
});

使用

        yield wait(2000);
        console.log('done' + i);
        sem.leave();

似乎有效。但是,如果我试图避免回调并学习如何正确使用Promises,我该怎么办呢?

0 个答案:

没有答案