【问题标题】:Best way to update html after promise result承诺结果后更新 html 的最佳方法
【发布时间】:2017-04-13 18:48:45
【问题描述】:

我想知道绑定承诺结果的最佳方式,即使用 angular 2 注入 html 标记(我使用 ionic 2)... 如您所知,异步编码的主要问题是失去对当前对象的引用。看来我应该将当前对象作为参数传递给 Promise 函数生成器。 我在互联网上搜索了更好的解决方案,但没有找到!那么有没有更好的方法呢?

Ionic 2 本身使用观察和订阅来执行异步进程。但主要问题是,对于无法观察到的现有功能,它无法工作!

我的方法:

可注入类:

export class PromiseComponent {
    doPromise = function (obj: any) {
        return new Promise(function (resolve2) {
            setTimeout(function () {
                resolve2({ num: 3113, obj: obj });
            }, 5000);
        });
    }
}

点击调用:

  promiseVal = 0
  doMyPromise() {
    this.myPromise.doPromise(this).then(this.secondFunc);//UPDATED HERE
  }


//UPDATED HERE
  secondFunc = function (res) {
    this.promiseVal = res.num
  }

HTML:

 <div>{{promiseVal}} </div>
 <button (click)="doMyPromise()">Do Promise</button>

【问题讨论】:

  • 我不明白你在做什么。是否要更新 promiseVal 并保留旧值?
  • 没有。只是在 html 中的 TimeOut 之后更新 promiseVal
  • 那你说的参考资料是什么意思?只需将res.num 分配给promiseVal。有什么问题?
  • @echonax 。因为它与此消息有错误:未捕获(承诺中):TypeError:无法设置未定义的属性“promiseVal”类型错误:无法设置未定义的属性“promiseVal”

标签: javascript angular promise ionic2


【解决方案1】:

如果你想在你的组件中使用一个 Promise:

promiseVal = 0
doMyPromise() {
  this.myPromise.doPromise().then((res) => {
    this.promiseVal = res.num
  });
}

我不知道您的服务背后的原因,但通常是这样的(可选):

export class PromiseComponent {
    doPromise() { //This method will return a promise
        return new Promise(function (resolve2) {
            setTimeout(function () {
                resolve2({ num: 3113, obj: obj });
            }, 5000);
        });
    }
}

OP 编辑​​帖子后:

你可以改变这个:

doMyPromise() {
    this.myPromise.doPromise(this).then(this.secondFunc);//UPDATED HERE
}

doMyPromise() {
    this.myPromise.doPromise(this).then(this.secondFunc.bind(this));//UPDATED HERE
}

【讨论】:

  • 调用then函数后,浏览器在this.promiseVal中找不到this 。似乎失去了对当前组件的引用。那么如果这项工作为什么会在这里发生错误?
  • @SiamakFerdos 你替换了doMyPromise 我写的吗?如果是这样,如果doMyPromise 在组件内部,this 将引用该组件。
  • 我恢复了问题出在哪里...我在then 中使用了一个我之前定义过的函数。当我将函数直接放入then 时,它可以工作。但是为了减少问题,我将该函数定义为then。在这种情况下它不起作用!我更新了我的问题...
  • @SiamakFerdos 我不知道您为什么要为自己复杂化,但请查看我更新的答案。
【解决方案2】:

如您所知,异步编码的主要问题是失去对当前对象的引用

这不是真的,箭头函数不会绑定自己的this,因此您不需要将this 发送到doPromise

export class PromiseComponent {
  doPromise () {
    return new Promise(function (resolve) {
      setTimeout(function () {
        resolve({ num: 3113 })
      }, 5000)
    })
  }
}

promiseVal = 0
doMyPromise() {
  this.myPromise.doPromise()
    .then(res => {
      this.promiseVal = res.num
    })
}

【讨论】:

  • 它有错误:错误错误:未捕获(在承诺中):TypeError:无法设置未定义的属性“promiseVal”类型错误:无法设置未定义的属性“promiseVal”
  • 是的,你说得对。当我将函数变量放入then 并且直接将函数放入then 时,我的问题就发生了,完全没有问题!!
猜你喜欢
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2017-12-26
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
相关资源
最近更新 更多