Promise.all 对比 m.sync

Promise.all vs m.sync

这两个功能有什么区别吗?

我最近在控制器中使用 Promise.all 时发现了一个问题。 视图将在 Promise.all 完成之前呈现,我会在视图中得到空变量。

因此,如果我使用一个 m.request 来点击一个 api,那么视图会等待它完成。如果我使用许多 m.request 包装在 Promise.all 中,那么它不会等待!我做错了什么吗?

这是正确的行为吗? m.sync 的行为是否会有所不同,它似乎具有与 Promise.all 相同的签名?

谢谢。

编辑

相关位的代码

// Does two requests and wraps them in Promise.all
Table.show = (id, load) => {
  var header = m.request({
    method: "GET",
    url: cfg.apiurl(`/tables/${id}`),
  });
  var body = m.request({
    method: "POST",
    url: cfg.apiurl(`/tables/${id}`),
    data: {
      data: load
    }
  });
  return Promise.all([header, body]);
};

// The component
var ShowTable = {
  controller, view
};

// Controller function
function controller() {
  this.header = m.prop({});
  this.records = m.prop([]);
  this.pages = m.prop(0);

  var load = {
    filter: {},
    paging: {
      number: 1,
      size: 10
    }
  };

  var showTable = () => {
    Table.show(m.route.param("id"), load).then((res) => {
      this.header(res[0].data);
      this.records(res[1].data);
      this.pages(res[1].meta.pages);
    }, (res) => {
      popa();
    });
  };

  showTable();

}

// View function
function view(vm) {
  return m("div", [
    m("p", vm.header()),
    m("p", vm.records()),
    m("p", vm.pages()),
  ]);
}

EDIT2

是的,m.sync 有效。但是 Promise.all 没有。

快速浏览一下文档,我就找到了 this page。重绘仅对 mithril 的内置函数进行,Promise.all 是原生的 javascript 函数,因此不会自动重绘。您应该在 showTable 函数中使用 m.syncm.startComputation/m.endComputation。您甚至可以直接 return [header, body] 而无需 Promise.all/m.sync,它们都是 promises 和秘银道具,因此您可以 use/assign 它们到您的视图模型,当它们的值被填充时,它应该触发在视图中重绘。

总之,如果还是不行,就别浪费时间了,把m.redraw()放在Promise.all的then里就行了。