Promise.all()中怎么传入带不同参数的同一个方法?
发布于 7 年前 作者 backcj 7504 次浏览 来自 问答
	let promiseFunc = util.promisify(func);
	let params = [1,2,3,4,5];
	let result = await Promise.all([promiseFunc(params[0]), promiseFunc(params[1])]);

类似上面一段代码,如何写一个方法,能直接返回我Promise.all()中需要传入的那些参数,效果如下:

	let promiseFunc = util.promisify(func);
	let params = [1,2,3,4,5];
	let resultINeed = functionINeed(params);
	let result = await Promise.all(resultINeed);
19 回复
function functionINeed(params) {
	return [promiseFunc(params[0]), promiseFunc(params[1])]
}

let params = [1,2,3,4,5];
let tasks = [];
for(let i = 0; i< params.length; i++){
	tasks.push(promiseFunc(params[i]));
}
let result = Promise.all(tasks);

@imhered

把promiseFunc(params[i])添加的数组的时候这个方法会直接执行的

let functionUNeed = function(func, params){
	return params.map((param)=>{
		return func.bind(null, param);
	});
};

参数func就是你要传入的promiseFunc

@backcj 执行就执行啊,有什么关系呢?

@nullcc 我得到的结果是这样的: [ [Function: bound func], [Function: bound func], [Function: bound func], [Function: bound func], [Function: bound func] ]

@backcj 然后你把这个函数数组扔进Promise.all()

@nullcc 就是Promise.all()之后返回的结果也是这样的

这种情况,我一般都像二楼那样处理~我才知道添加到数组的时候,这个方法会直接执行啊?

或者你试试这个

let functionUNeed = function(func, params){
	return params.map((param)=>{
		return func.call(null, param);
	});
};

问一下题主,是如何测试添加进数组的时候,方法会执行的呢?

@XhuiWang 是这样的,添加进去就执行了。Promise.all 相当于只是拿结果而已。 但是我觉得并没有任何影响

@XhuiWang 简单。定义一个返回Promise的函数,函数体内console一下。 然后直接往数组里add,不调用Promise.all。 你可以看到就有log输出

@XhuiWang @imhered 这个方法之前我试过,可能哪里有地方写错了,就一直以为不行,刚刚试了个简单的,可以用,Thanks

@nullcc 这个可以,感谢

@imhered 我每次这么做主要是怕在for循环中await异步请求导致效率很低,这么说来,用Promise.all()会执行两遍,效率是不是也很差?

@XhuiWang 当然不会,只会执行一遍的。你可以测试下,只会执行一次 不只是Promise.all,Promise.props 也是add进去就执行了

@imhered 原来是这样,受教了!谢谢

Bluebird Promise.map

回到顶部