我尝试将示例JQuery promise-queue中的fiddle转换为Nodejs,因为它符合我的要求。我遇到以下问题,这是我的代码和错误
"TypeError: dfd.promise is not a function"
return dfd.promise();
我要编写的代码只是另一个速率限制器,我每秒只能发出3个请求,并且所有请求都是承诺,我想将所有请求放入队列,一旦它解决或拒绝,则仅等待下一次等待队列中的请求可以开始处理。蓝鸟队列以块为单位操作队列中的项目。我尝试锻炼的内容与之前的stackoverflow链接中的内容完全相同。我才刚刚起步,我陷入了第一部分。
var Queue = require("promise-queue");
var Promise = require("bluebird");
var maxConcurrent = 1;
//var maxQueue = Infinity;
var queue = new Queue(maxConcurrent, 2);
// Or just Queue.configure(window.Promise);
Queue.configure(function (handler) {
var dfd = Promise.defer();
try {
handler(dfd.resolve, dfd.reject, dfd.progress);
} catch (e) {
dfd.reject(e);
}
return dfd.promise();
});
// max concurrent - 1
// max queue - 2
var id = 0;
function processSomethingHeavy() {
id++;
var dfd = Promise.defer();
var loading = id;
setTimeout(dfd.resolve, 4000, loading);
return dfd.promise();
}
function status() {
console.log('Pending ' + queue.pendingPromises + '/' + queue.maxPendingPromises + ' Queued ' + queue.queue.length + '/' + queue.maxQueuedPromises);
}
queue.add(processSomethingHeavy)
.then(function (loading) {
status();
console.log('loading',loading);
}, function (err) {
console.log('error',err);
});
queue.add(processSomethingHeavy)
.then(function (loading) {
status();
console.log('loading',loading);
}, function (err) {
console.log('error',err);
});
答案 0 :(得分:0)
通常,您要停止使用deferred
并开始使用Promise
。
鉴于您正在nodejs
中运行代码,Promises应该是本地支持的,所以不需要Bluebird。
根据承诺队列的docs:
默认情况下,Queue尝试使用全局Promises,但是您可以指定自己的Promise。
因此,您将完全跳过此步骤,因为您将拥有本机承诺。
最后,您可以将processSomethingHeavy
更新为使用Promise
。
function processSomethingHeavy() {
return new Promise(function(resolve) {
var loading = ++id;
setTimeout(resolve, 4000, loading);
});
}