我正在尝试使用NodeJS只允许两个任务同时访问一段代码(这可能是例如访问API,但下面使用yield wait(2000)
模拟。我正在使用{{ 1}}包使其适用于生成器和承诺而不是回调,但下面的代码只允许一次1而不是2来访问co
和yield 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,我该怎么办呢?