Promise 映射并获取数组的当前值
Promise map and get current value of array
下面我有一张正则诺蓝鸟图。我想要实现的是一种访问 arr
当前值的方法,换句话说,我想从地图中访问 arr
并返回所有前面的内容值。由于此功能,我还希望整个数组 运行 线性和串联({concurrency: 1}
)。
这是一种特殊的地图吗? 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' ] ]
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('+'))
})
您只需使用地图中的当前索引更新数组 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>
下面我有一张正则诺蓝鸟图。我想要实现的是一种访问 arr
当前值的方法,换句话说,我想从地图中访问 arr
并返回所有前面的内容值。由于此功能,我还希望整个数组 运行 线性和串联({concurrency: 1}
)。
这是一种特殊的地图吗? 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' ] ]
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('+'))
})
您只需使用地图中的当前索引更新数组 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>