You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:42:55