查看方法spex.page 和spex.sequence。它们旨在为 data throttling + load balancing 实现任何可能的承诺策略。
请参阅以下项目文档中的几个示例。
平衡的页面来源
下面的示例使用方法page 启动5 个页面的序列,然后将解析的数据记录到控制台。源函数为每个页面提供半秒的延迟。
var $q = require('q');
var spex = require('spex')($q);
function source(index, data, delay) {
return new $q.Promise(function (resolve, reject) {
setTimeout(function () {
resolve([
"page-" + index, // simple value;
$q.resolve(Date.now()) // promise value;
])
}, 500); // wait 1/2 second before serving the next page;
});
}
function logger(index, data, delay) {
console.log("LOG:", data);
}
spex.page(source, {dest: logger, limit: 5})
.then(function (data) {
console.log("FINISHED:", data);
});
输出:
LOG: [ 'page-0', 1446050705823 ]
LOG: [ 'page-1', 1446050706327 ]
LOG: [ 'page-2', 1446050706834 ]
LOG: [ 'page-3', 1446050707334 ]
LOG: [ 'page-4', 1446050707839 ]
FINISHED: { pages: 5, total: 10, duration: 2520 }
平衡序列接收器
在下面的示例中,我们有一个sequence,它在索引小于 5 时返回数据,目标函数在处理从源解析的每个数据时强制延迟 1 秒。
var $q = require('q');
var spex = require('spex')($q);
function source(index, data, delay) {
console.log("SOURCE:", index, data, delay);
if (index < 5) {
return $q.resolve(index);
}
}
function dest(index, data, delay) {
console.log("DEST:", index, data, delay);
return new $q.Promise(function (resolve, reject) {
setTimeout(function () {
resolve();
}, 1000);
});
}
spex.sequence(source, dest)
.then(function (data) {
console.log("DATA:", data);
});
输出:
SOURCE: 0 undefined undefined
DEST: 0 0 undefined
SOURCE: 1 0 1011
DEST: 1 1 1001
SOURCE: 2 1 1001
DEST: 2 2 1001
SOURCE: 3 2 1000
DEST: 3 3 1000
SOURCE: 4 3 1001
DEST: 4 4 1001
SOURCE: 5 4 1000
DATA: { total: 5, duration: 5013 }