能否在Bluebird的map方法中绑定this?附代码示例
梳理你的Promise类与数组处理问题
嘿,我先把你给出的代码整理成更易读的格式,这样能更清楚看到问题点:
class add { constructor(baseValue) { this.base = baseValue; return new Promise((resolve, reject) => { resolve(this); }); } addBase(num) { return new Promise((resolve, reject) => { resolve(this.base + num); }); } } const values = [1,2,3,4,5]; // 你应该是写到一半的调用逻辑? Promise.try(() => { return new add(...) })
看起来你是想结合这个返回Promise的类,对values数组做异步链式处理对吧?我给你理清楚几个优化点,同时补全完整的实现:
简化类的Promise逻辑
其实你的构造函数没必要返回Promise——如果没有实际的异步操作(比如请求、定时器),完全可以在实例化后用Promise.resolve()来包装,代码会更简洁规范:
// 类名首字母大写是JS编码规范,方便区分类和普通函数 class Add { constructor(baseValue) { this.base = baseValue; } addBase(num) { // 没有异步操作的话,直接返回Promise.resolve即可 return Promise.resolve(this.base + num); } }
针对values数组的两种常见处理方式
方式一:依次累加(链式更新base值)
如果你的需求是用初始base值,依次加上values里的每个数(比如初始base=0,加1得1,再加2得3,直到最后得到15),可以用数组的reduce方法来构建Promise链:
const values = [1,2,3,4,5]; const initialBase = 0; values.reduce((promiseChain, currentNum) => { return promiseChain.then(currentBase => { const addInstance = new Add(currentBase); return addInstance.addBase(currentNum); }); }, Promise.resolve(initialBase)) .then(finalResult => { console.log(finalResult); // 最终输出15 }) .catch(error => { console.error('处理出错:', error); });
方式二:并行计算每个值的结果
如果是想用同一个初始base值,分别和values里的每个数相加,得到所有结果的数组,可以用Promise.all来并行处理:
const initialBase = 0; const addInstance = new Add(initialBase); Promise.all(values.map(num => addInstance.addBase(num))) .then(results => { console.log(results); // 输出 [1,2,3,4,5] }) .catch(error => { console.error('处理出错:', error); });
关于你代码里的Promise.try
标准ES6 Promise并没有Promise.try这个API哦,如果你是想启动一个Promise链,用Promise.resolve()来初始化就可以了。
内容的提问来源于stack exchange,提问作者Renari
相关产品推荐
相关产品推荐

