使用Bluebird时Promise.map返回顺序异常问题及代码实现咨询
解决Bluebird Promise.map返回顺序异常的问题
嘿,我看你遇到了Promise.map输出顺序不对的问题,咱们先拆解下代码里的小问题,修正后就能完美解决啦:
你的代码核心问题
- 回调未正确返回异步Promise链:你在
Promise.map的回调里,虽然处理了$http请求,但最后错误地返回了一个仅存在于then回调作用域里的response变量,根本没把异步请求的Promise链返回给Promise.map。这会导致它无法追踪每个请求的完成状态,自然没法保证顺序。 - 多余的
Promise.resolve包裹:$http.get本身就会返回Promise,完全不需要再用Promise.resolve包裹,属于画蛇添足的操作。
修正后的代码
const groupCast = [Promise.resolve("name1"), Promise.resolve("name2"), Promise.resolve("name3")]; Promise.map(groupCast, function (group) { // 直接返回$http的Promise链,让Promise.map能追踪异步状态 return $http.get("/getdata", { params: { group: group } }) .then(function(response) { console.log(group, " done"); return response.data; // 建议返回实际需要的数据,比如response.data,可按需调整 }); }) .then(function(resp) { console.log(resp); // 这里会按["one", "two", "three"]的顺序输出 });
为什么这样改就正常了?
Bluebird的Promise.map默认会严格保持输入数组的顺序——不管内部异步操作谁先完成,最终输出的结果数组都会和输入数组的元素一一对应。但前提是你必须在每个回调里正确返回对应的Promise,这样Promise.map才能知道要等待每个异步操作完成,再按顺序收集结果。
另外补充个小优化:你的groupCast里都是Promise.resolve包裹的字符串,其实直接用普通字符串数组["name1", "name2", "name3"]就行,Promise.map会自动把非Promise元素转换成resolved状态的Promise。
内容的提问来源于stack exchange,提问作者uniXVanXcel
相关产品推荐
相关产品推荐

