Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promise.all vs.m.sync_Javascript_Mithril.js - Fatal编程技术网

Javascript Promise.all vs.m.sync

Javascript Promise.all vs.m.sync,javascript,mithril.js,Javascript,Mithril.js,这两种功能之间有什么区别吗 我最近在控制器中使用Promise.all时发现了一个问题。 视图将在Promise.all完成之前呈现,并且我将在视图中获取空变量 因此,如果我使用一个m.request来点击单个api,那么视图将等待它完成。如果我使用了许多包装在Promise.all中的m.request,那么它就不会等待!我做错什么了吗 这是正确的行为吗?Ism.sync的行为会有所不同,它似乎与Promise具有相同的签名。所有的 谢谢 编辑 包含相关位的代码 // Does two req

这两种功能之间有什么区别吗

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

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

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

谢谢

编辑

包含相关位的代码

// 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
可以工作。但是,
承诺。所有的
都没有。

快速浏览一下文档,我发现。重画只针对mithril的内置函数,
Promise进行。所有的
都是本机javascript函数,因此没有自动重画。您应该在
showTable
函数中使用
m.sync
m.startcompution/m.endcomputing
。您甚至可以直接返回
[header,body]
,而无需
Promise.all/m.sync
,它们都是promises和mithril道具,因此您可以将它们使用/分配给viewmodel,当填充它们的值时,应该会触发视图中的重画


无论如何,如果它仍然不起作用,不要浪费你的时间,只要把
m.redraw()
放在
承诺中就行了。所有的

都是你做错了什么。可能如果没有代码,就不可能知道您是否向我们展示了代码,那么我们很可能会告诉您代码中的错误。如果没有,那我们就无能为力了。我希望我做错了什么,否则我会发疯的。为您添加了精简代码。发布所有位太多了,所以我尽可能多地对其进行了修剪,以保留问题的要点。如果
m.sync
m.request
返回的和
Promise.all
不正确的所谓承诺一起工作,显然,
m.request
返回的所谓承诺存在某种问题,
promise.all
无法很好地处理。如果没有任何有趣的控制台消息,我建议您将
m.sync
m.request
一起使用,因为它们来自同一个库,所以它们可能相互理解所谓的承诺