【问题标题】:Why does promise resolve with promise?为什么 Promise 会用 Promise 解决?
【发布时间】:2016-03-11 23:25:05
【问题描述】:

我的代码中有一个承诺始终失败。当我向Promise#then 回调返回一个承诺时,它不会等待承诺解决,而是将其作为参数传递给后续的Promise#then 调用。

更多详细代码请参见gist 中的代码。调用 House#setEnergyData 会导致问题(请参阅 gist 中的 cmets)。

在我的代码中导致问题的基本模式如下所示(尽管此文字代码确实有效):

class Class1 {
    step1(){
       return new Promise((fnResolve, fnReject)=>{
       // do something
       fnResolve();
     });
    }

    step2(){
       return this.step1().then(()=>{ 
         // do something else
       });
    }
 }

 class Class2 {

   constructor(){
     this.class1 = new Class1();
   }

   doSomething(){
      this.class1.step2()
        .then((res)=>{
          console.log(res) // Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
          // do something that shouldn't happen until Class1#step2 has finished.
          // error!
        });
   }
 }

这是在浏览器中运行并使用 Babel ES2015 预设编译并使用 Babel polyfill。我没有使用任何Promise npm 模块。

这在我的代码中的多个地方重复出现。我不确定这是编译过程、babel polyfill 的问题,还是我误解了 Promise。

【问题讨论】:

  • @Paulpro 我看到了 - 这是一个错字,现在已修复。
  • 显示你的实际代码
  • 在您的示例中,您永远不会解决或拒绝您的承诺。
  • @naomik 代码库不是开源的,但您可以签出this gist - 问题在于何时调用House#setEnergyData
  • 你的代码没有意义 - 承诺永远不会用承诺解决 - 他们总是解开价值

标签: javascript promise ecmascript-6 babeljs


【解决方案1】:

尝试在.then()step2 中包含return 语句以从Promisestep2() 调用中返回值

class Class1 {
  step1() {
    return new Promise((fnResolve, fnReject) => {
      // do something
      fnResolve(123);
    });
  }
  step2() {
    return this.step1().then((data) => {
      // do something else
      // added `return` here
      return data
    });
  }
}

class Class2 {
  constructor() {
    this.class1 = new Class1();
  }
  doSomething() {
    this.class1.step2()
      .then((res) => {
        console.log(res) // 123
      });
  }
}

var c = new Class2();
c.doSomething();

【讨论】:

  • 我看到这行得通,但是如果你看看我提供的要点,那似乎不是一个关键的区别(我在要点中返回一个对象)。另外,在Class1#step2 中,尝试设置一个实例变量this.step2_has_run = true; 并且不要返回任何内容。然后在Class2#doSomethingconsole.log(this.class1.step2_has_run); // true
  • @EricH。 “我认为这是可行的,但是如果您查看我提供的要点,那似乎并不是关键的区别(我在要点中返回了一个对象)。” javascript at要点与问题的javascript 不同? "另外,在 Class1#step2 中,尝试设置实例变量 this.step2_has_run = true; 并且不返回任何内容。然后在 Class2#doSomething 中,console.log(this.class1.step2_has_run); // true" ?不确定预期的结果是什么?
  • 是的,要点要复杂得多。在这个问题中,我只是以抽象的方式表示问题......考虑到它确实有效,这可能没有帮助 - 我在上面的评论中的例子我试图指出 即使没有 返回任何数据,代码仍然按预期工作......我会在问题中更清楚地说明这一点。
  • @EricH。预期的结果是什么?
  • .then() 创建一个新的Promise,尽管日志消息并未表明解析的Promise 的值是Promise[[PomiseValue]] 私有属性是 undefinedjs 在 Question;解析的值不是 Promise 。在问题的js 处没有将值传递给fnResolve。如果 123 传递给 fnResolve ,则 123 应该记录在 .then()
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2017-06-21
相关资源
最近更新 更多