承诺映射并获取数组的当前值

Promise map and get current value of array

本文关键字:数组 映射 获取 承诺      更新时间:2023-09-26

下面我有一个常规的承诺蓝鸟地图。我想实现的是一种访问arr当前值的方法,换句话说,我想从具有所有前面返回值的映射中访问arr。由于这个功能,我还希望整个数组线性和串行运行({concurrency: 1})。

这是一种特殊的地图吗?蓝鸟本地提供这个吗?

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' ] ]

您只需要使用映射中的当前索引更新数组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。你可以使用return item。运行下面的代码片段查看。

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>

var Promise = require('bluebird')
function promiseMapActive (arr, cb) {
  var count = 0
  return Promise.reduce(arr, function (arrActive, action) {
    return Promise.resolve(cb(action, count, arrActive)).then(function (value) {
      arrActive[count] = value
      count = count + 1
      return arrActive
    })
  }, arr)
}
var arr = ['alpha', 'beta', 'gamma']
promiseMapActive(arr, function (item, index, arr) {
  console.log([item, arr])
  return Promise.resolve(['x', item].join('+'))
})