javascript - Promise 映射并获取数组的当前值

标签 javascript promise bluebird

下面我有一张定期的 promise Bluebird map 。我想要实现的是一种访问 arr 当前值的方法,换句话说,我想从 map 内访问 arr与所有前面的返回值。由于此功能,我还希望整个数组线性且串行运行 ({concurrency: 1})。

这是一种特殊的 map 吗? Bluebird 本身提供此功能吗?

var Promise = require('bluebird')

var arr = ['alpha', 'beta', 'gamma']

Promise.map(arr, function (item) {
  console.log([item, arr])
  return Promise.resolve(['x', item].join('+'))
}, {concurrency: 1})

// logs:

// [ 'alpha', [ 'alpha', 'beta', 'gamma' ] ]
// [ 'beta', [ 'alpha', 'beta', 'gamma' ] ]
// [ 'gamma', [ 'alpha', 'beta', 'gamma' ] ]

// expected / desired:

// [ 'alpha', [ 'alpha', 'beta', 'gamma' ] ]
// [ 'beta', [ 'x+alpha', 'beta', 'gamma' ] ]
// [ 'gamma', [ 'x+alpha', 'x+beta', 'gamma' ] ]

最佳答案

您只需使用 map 中的当前索引更新数组arr:

var arr = ['alpha', 'beta', 'gamma'];

P.map(arr, function(item, index, length) {
  // For displaying output
  document.body.appendChild(
    document.createTextNode(JSON.stringify([item, arr], null, 2))
  );
  document.body.appendChild(document.createElement('br'));

  // Update array by index
  arr[index] = ['x', item].join('+');
  return P.resolve(item);
}, {concurrency: 1});
<script src="//cdn.jsdelivr.net/bluebird/2.9.3/bluebird.js"></script>

已在 Node 上进行测试,但为了方便起见,此处使用浏览器库进行了显示。

注意:使用 Promise,返回值时不需要调用 resolve。您只需使用返回即可。运行下面的代码片段即可查看。

var arr = ['alpha', 'beta', 'gamma'];

P.map(arr, function(item, index, length) {
  // For displaying output
  document.body.appendChild(
    document.createTextNode(JSON.stringify([item, arr], null, 2))
  );
  document.body.appendChild(document.createElement('br'));

  // Update array by index
  arr[index] = ['x', item].join('+');
  return item;
}, {concurrency: 1});
<script src="//cdn.jsdelivr.net/bluebird/2.9.3/bluebird.js"></script>

关于javascript - Promise 映射并获取数组的当前值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32158217/

相关文章:

javascript - 通过 View 中的 @ViewChild 调用组件上的方法到 QueryList

javascript - Angular-ui 模态问题

javascript - Node js 嵌套 Promise.all 错误

javascript - Bluebird 两种返回类型的差异

javascript - Bluebird 协程根本不执行

javascript - 像 Q 一样定义空的 Bluebird promise

javascript - 在 summernote 编辑器中用插入替换选定的文本

javascript - Travis CI QUnit 构建失败,并在 jQuery 上出现 ReferenceError

javascript - 如何使用 AWS SDK for S3 修复 JavaScript Promise?

angularjs - 使用 Jasmine 测试 Angular Controller 对带有 Promise 返回的服务的调用的最佳方法