【问题标题】:EmberJS: How to make a helper that can return data from a promiseEmberJS:如何制作一个可以从 Promise 中返回数据的助手
【发布时间】:2016-03-30 22:02:36
【问题描述】:

我创建了一个{{findby}} 助手,它对于从数组中挑选一个项目非常有用,但我遇到了一个问题。助手不喜欢在一个 promiseArray 的数组上调用 findBy()

因此修改了助手来执行此操作:

export function findby([array, key, value]) {
  let isPromiseArray = Ember.typeOf(array.then) === 'function';
  if (isPromiseArray) {
    array.then((arr) => {
      return arr.findBy(key, value) || null;
    });
  } else {
    return array.findBy(key, value) || null;
  }
}

export default Ember.Helper.helper(findby);

当然,如果传递的数组恰好是 PromiseArray,则在尝试调用 findBy() 之前使用 then()

问题是在这种情况下我似乎无法返回任何内容。从then() 内部返回似乎并没有真正关闭辅助函数,因此辅助函数返回未定义。

如果我尝试这样做:

return array.then((arr) => {
  return arr.findBy(key, value) || null;
});

然后从助手返回的只是承诺本身。

这是我尝试过的一个小技巧:https://ember-twiddle.com/c82fb0e11641703f118e867b45403654?numColumns=2&openFiles=controllers.application.js%2Chelpers.findby.js

对于助手来说,这个问题似乎很普遍:有没有办法从助手中的 promise/then() 函数返回数据?我想知道我想做的事情是否可以通过助手来实现?

【问题讨论】:

标签: ember.js


【解决方案1】:

我认为你应该打电话给recompute

所以是这样的:

function findBy([array, key, value]) {
    let content = Ember.get(array, 'content');

    if(!content) {
        array.then(() => this.recompute());
        return null;
    }

    return content.findBy(key, value) || null;
}

您尝试的方法是不可能的。如果你写 return .then(() => <here>);,你返回的是箭头函数而不是父函数。父函数很久以前就返回了,它甚至不会等待承诺。

但是您可以随时致电.recompute 重新计算,这对您有用。

【讨论】:

  • 这看起来是个好主意.. 我看到类似于查看 promise-helper 插件的代码.. 但是.. 我可以在普通辅助函数上调用 recompute 吗?还是需要一个基于类的助手?
  • 我不是 100% 确定,但我认为 ember 数据将您的函数包装在一个辅助实例中。所以它应该工作。但是试试吧。
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多