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
,那么它就不会等待!我做错什么了吗
这是正确的行为吗?Ism.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
一起使用,因为它们来自同一个库,所以它们可能相互理解所谓的承诺