2017-01-08 8 views
0

私はPromisifyにbluebirdを使用しようとしています。この関数にはオプションの第2引数(weight)があり、メソッドまたは全体を実行しようとしていますオブジェクト。オプションの引数でコールバックスタイルを宣言し、複数回実行する

RateLimit.prototype.incr = function(keys, weight, callback) { 
    var args, err, _ref, _ref1; 
    if (arguments.length === 2) { 
     _ref = [1, weight], weight = _ref[0], callback = _ref[1]; 
    } 
    try { 
     _ref1 = this.scriptArgs(keys, weight), keys = _ref1[0], args = _ref1[1]; 
    } catch (_error) { 
     err = _error; 
     return callback(err); 
    } 
    return this["eval"].exec(this.checkIncrFn, keys, args, (function(_this) { 
     return function(err, result) { 
     return callback(err, __indexOf.call(_this.constructor.DENIED_NUMS, result) >= 0); 
     }; 
    })(this)); 
    }; 

オリジナルはこちら(https://github.com/dudleycarr/ratelimit.js/blob/master/src/rate_limit.coffee)であるが、CoffeeScriptのはそう、このコンパイルされたバージョンは、もう少し普遍的に読み取り可能である考え出し。

私はカスタムの約束が必要だろうと思いますか?

また、私の最終目標は、回帰テストスイートでこの呼び出しを行い、同じキーと重みの呼び出しパラメータで構成可能な時間を実行し、私の中の各コールバックから結果の配列を得ることです最終的なコールバック。

このような何か:

var runTimes = 5; 
var runKey = ‘akey’; 
var runWeight = 2; 

var keyMap = Array(5).fill(runKey); 

Promise.all(Promise.map(keyMap, (k, w) => pPromisifiedIncr(k, w)) 
.then((values) => { 
    console.log(values); 
})); 

I)は、(配列の組み合わせを試した(記入)マップやPromises.mapが、かなり起因する初期Promisify自体の問題におそらくそれを取得することができませんでした。 。ありがとう!

+0

約束は一つの引数を必要とするので、私は、あなたが希望通りのようにそれを行うことができますかわかりません。 .. – dandavis

+0

あなたの 'incr'は' keys'と 'weight'パラメータを必要とし、' RateLi私はあなたが 'pPromisifiedIncr(k)'に何をすると思いますか? – Bergi

+0

あなたは 'incr'ではなく' exec'を約束し、 'incr'を約束のスタイルで書くべきです。 – Bergi

答えて

0

それはあなたが何をしようとしているものを見るために少し難しいですが、ここでmanaullyがincr() promisified示しアイデアと値の配列を介して実行するPromise.map()の使用です:

RateLimit.prototype.incr: function(keys, weight, callback) { 
    return new Promise((resolve, reject) => { 
     let args; 

     // callback argument is optional 
     if (arguments.length === 2) { 
      callback = weight; 
      weight = 1; 
     } 

     // if this throws, it will automatically reject the promise 
     [keys, args] = this.scriptArgs(keys, weight); 
     this["eval"].exec(this.checkIncrFn.bind(this), keys, args, (err, result) => { 
      if (err) { 
       reject(err); 
      } else { 
       resolve(result.indexOf(this.constructor.DENIED_NUMS) > 0); 
      } 
     }); 
    }); 
} 


var keys = [{weight: 1, key: 'akey1'}, {weight: 2, key: 'akey2'}, {weight: 3, key: 'akey3'}, {weight: 4, key: 'akey4'}]; 

Promise.map(keys, item => xxx.incr(item.key, item.weight)).then((values) => { 
    console.log(values); 
}); 

I私はあなたの.incr()機能が何をしようとしているのか、どのようにそれがまっすぐなJavascriptに変換されているのかを詳細に追うとは言えませんが、これはあなたが達成しようとしていることの一般的なアイデアを与えるはずです。

0

.incr()メソッドがすでに動作している場合(特に、プロジェクトに組み込むサードパーティ製のライブラリの一部である場合)、最良の選択肢は、それをそのままにして、別の方法を作成することです

RateLimit.prototype.incrPromise = function(keys, weight) { 
    var self = this; 
    var args = arguments; 

    return new Promise(function (resolve, reject) { 
     var callback = function (err, result) { 
      if(err) { reject(err); } else { resolve(result); } 
     }; 

     self.incr.apply(self, Array.prototype.concat.call(args, callback)); 
    }); 
}; 

これを使用するには:それはかなり簡単です、その場合には約束のバージョン、のために

var runTimes = 5; 
var runKey = ‘akey’; 
var runWeight = 2; 

var keyMap = Array(5).fill(runKey); 
var myRateLimit = new RateLimit(); // create RateLimit here  

Promise.all(Promise.map(keyMap, (k, w) => myRateLimit.incrPromise(k, w)) 
    .then((values) => { 
     console.log(values); 
    })); 
関連する問題