Javascript 如果存在';的并发性,但通过了单元测试

Javascript 如果存在';的并发性,但通过了单元测试,javascript,promise,bluebird,Javascript,Promise,Bluebird,我天真地以为我可以把一个.map()链接到一个Promise.map()上,但似乎我错了。我遇到了一个恼人的问题,即当并发性很高时,通过单元测试,但实际测试失败。我认为这是值得注意的堆栈溢出问题 我将代码更改为使用通常的.then()模式,现在它似乎每次都能工作 这里的问题是,与JS中的数组不同,我无法将.map()链接到Promise.map()上,还是我做错了什么?我注意到我在工作版本中解决了一些lint问题,但这似乎并没有对行为产生影响 下面是随机失败的代码(当并发性较高时),以及在低并发

我天真地以为我可以把一个
.map()
链接到一个
Promise.map()
上,但似乎我错了。我遇到了一个恼人的问题,即当并发性很高时,通过单元测试,但实际测试失败。我认为这是值得注意的堆栈溢出问题

我将代码更改为使用通常的
.then()
模式,现在它似乎每次都能工作

这里的问题是,与JS中的数组不同,我无法将
.map()
链接到
Promise.map()
上,还是我做错了什么?我注意到我在工作版本中解决了一些lint问题,但这似乎并没有对行为产生影响

下面是随机失败的代码(当并发性较高时),以及在低并发性单元测试中似乎一直有效的代码。请注意所有称为返回承诺的函数

// this has concurrency issues. occasionally the function
// returns [{ key: undefined: val: correct }]
db.assocThreeFewCountsGet = function(manyid, atype) {
  counts = [];
  return db.assocThreeFewDistinctGet(manyid, atype)
  .then(r => {
    console.log('Distinct', r);   // shows there are valid IDs
    counts = r;
    return Promise.map(r, fewid => {
      return db.assocCount(manyid, fewid);
    }).map((el, idx) => {
      return { key: counts[idx], val: el };
    });
  });
};

// this appears to work correctly.  key: and val: are correct
db.assocThreeFewCountsGet = function(manyid, atype) {
  var ids;
  return db.assocThreeFewDistinctGet(manyid, atype)
  .then(r => {
    ids = r;
    console.log('Distinct IDs:', ids);  // shows there are valid IDs
    return Promise.map(ids, fewid => {
      return db.assocCount(manyid, fewid);
    });
  }).then(counters => {
    return counters.map((el, idx) => {
      return { key: ids[idx], val: el };
    });
  });
};

计数=[]工作分配可疑,似乎不正确。这将导致各种问题,包括异步方法并发执行中引用最新数组的计数。同样,在您的工作代码中,您有用于相同目的的
var id
,这是每个调用的本地属性

如果您不需要在其他任何地方使用
计数
,请使用

db.assocThreeFewCountsGet = function(manyid, atype) {
  return db.assocThreeFewDistinctGet(manyid, atype)
  .then(counts => {
    console.log('Distinct', counts);   // shows there are valid IDs
    return Promise.map(counts, fewid => {
      return db.assocCount(manyid, fewid);
    }).map((el, idx) => {
      return { key: counts[idx], val: el };
    });
  });
};

你的目标是什么?
assocCount
做了什么,它是否发生了变异
r
?目标实际上是将一个表(DistinctGet)中的ID与另一个表(countGet)中的计数组合起来。没有一个函数被称为mutate。我看不出这有什么不起作用的原因。回调函数中的
idx
是什么?还可以在循环之前和循环内部
console.log(JSON.stringify(counts))
吗?Promise.map和Array.map的第二个参数是索引。我试图从这个问题中确定第二个.map()是Promise.map还是Array.map。如果它是一个Array.map,它可能会解释问题,因为它在承诺得到解决之前就绑定了?至于要获得更多调试信息的复制。。。它发生在一个让经理非常恼火的地方。如果我能在单元测试中重新编程,我会很高兴。。。但我不知道怎么做,很可能就是这样。在prod中,这称为10次并行,在测试中称为一次。啊。我想我已经默认打开了ES6(节点7.7.3)。“严格使用”现在到处都在流行,我现在正在戒酒。真尴尬。感谢您的时间。根据我们的转换和原始问题,第一个非工作版本中的第二个
.map()
,您的示例很好,这是一个
Promise.prototype.map
。我用谷歌搜索了一下,但找不到答案,所以现在,至少有了答案。