背景:
- 我正在编写一个流星应用程序,该应用程序最初使用通过 SOAP 请求检索到的数据填充数据库,该请求是通过对某处服务器上的 API 端点发出的请求。
- 初始请求是通过我选择的搜索词进行搜索。我返回一个与我的搜索匹配的记录的 id 列表。
- 然后我发出另一个 API 请求,但这一次,对于我存储到我自己的数据库中的每一个记录(仅选择的值,而不是所有数据)
- 如果我有一个搜索词列表,则对每个搜索词执行上述操作。
- 为了避免“回调地狱”,并且因为我认为这是一个学习新东西的好机会,我选择使用按顺序排列的 Promises:它是这样的:forEach searchTerm -> getTheResults.then.forEachResult->fetchRecord
- 对于 100 左右的短序列,它工作得很好,但是当它达到 1000 时它会挂起。在与 Google 叔叔交谈后,我遇到了一些关于原生 Promise 没有以某种方式优化以及更快的第三方库的话题。所以我决定尝试 Bluebird,但在此之前,我会测试它可能会使事情变得更快的断言。
代码 下面的代码创建了一系列“睡眠承诺”。想法是更换 Bluebird Promise 实现并观察测试运行超过 5000 个 Promises 的时间。
var Promise = require("bluebird"); // comment out for native implementation
function sleep(time) {
return new Promise(function (resolve, reject) {
setTimeout(function() {
// process.stdout.write(".");
resolve(true);
}, time);
});
}
// the function is badly named, please ignore
function nativePromiseSequence(n) {
// dont know how this first line works
const arr = Array.apply(null, Array(n)).map(function () {});
return arr.reduce(function(sequence, e, i, a) {
return sequence.then(function() {
return sleep(1);
});
}, Promise.resolve());
}
我使用“chai-as-promised”来测试承诺的测试。
it('Run 5000 promises in a chain', function() {
this.timeout(7000);
return nativePromiseSequence(5000).should.eventually.equal(true);
});
在 5000 的 Promise 链上的结果 ,使用 Bluebird 实现的测试完成的速度比 Native 承诺的慢约一秒
我在这里犯了错误还是错过了什么?