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.sync
或 m.startComputation/m.endComputation
。您甚至可以直接 return [header, body]
而无需 Promise.all/m.sync
,它们都是 promises 和秘银道具,因此您可以 use/assign 它们到您的视图模型,当它们的值被填充时,它应该触发在视图中重绘。
总之,如果还是不行,就别浪费时间了,把m.redraw()
放在Promise.all
的then里就行了。
这两个功能有什么区别吗?
我最近在控制器中使用 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.sync
或 m.startComputation/m.endComputation
。您甚至可以直接 return [header, body]
而无需 Promise.all/m.sync
,它们都是 promises 和秘银道具,因此您可以 use/assign 它们到您的视图模型,当它们的值被填充时,它应该触发在视图中重绘。
总之,如果还是不行,就别浪费时间了,把m.redraw()
放在Promise.all
的then里就行了。