尝试将Promise-queue示例转换为Node.js

时间:2018-06-19 16:39:12

标签: javascript node.js promise queue bluebird

我尝试将示例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);
    });

1 个答案:

答案 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);
    });
}