0

背景

  1. 我正在编写一个流星应用程序,该应用程序最初使用通过 SOAP 请求检索到的数据填充数据库,该请求是通过对某处服务器上的 API 端点发出的请求。
  2. 初始请求是通过我选择的搜索词进行搜索。我返回一个与我的搜索匹配的记录的 id 列表。
  3. 然后我发出另一个 API 请求,但这一次,对于我存储到我自己的数据库中的每一个记录(仅选择的值,而不是所有数据)
  4. 如果我有一个搜索词列表,则对每个搜索词执行上述操作。
  5. 为了避免“回调地狱”,并且因为我认为这是一个学习新东西的好机会,我选择使用按顺序排列的 Promises:它是这样的:forEach searchTerm -> getTheResults.then.forEachResult->fetchRecord
  6. 对于 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 承诺的慢约一秒

我在这里犯了错误还是错过了什么?

4

0 回答 0