javascript Promise 的多个 onload 事件
Multiple onload events with javascript Promise
我正在尝试将多个承诺链接到 Promise.all([...])
并在 onload
回调中激活每个承诺。我的代码:
var styleSheetPromises = []
// styles version
for (var link of iframe.contentWindow.document.querySelectorAll("link[rel=stylesheet]")) {
//var linkPromise = new Promise((resolve) => resolve())
var linkPromise = () => new Promise((resolve) => resolve())
styleSheetPromises.push(linkPromise)
link.onload = function () {
console.log('stylesheet loaded')
//linkPromise()
}
link.href = link.href.replace(/\?.*|$/, "?v=4")
}
Promise.all(styleSheetPromises).then((values) => {
console.log('All stylesheets are loaded')
});
以上代码在 iframe 中附加样式表的版本,并确定何时加载所有样式表 Promise.all
。
我的代码中的问题是 Promise.all
没有在 onload 事件回调中调用 linkPromise()
就激活了。将在“加载样式表”之前记录“加载所有样式表”。
我如何正确链接承诺并在 onload
事件中激活它们并使用 Promise.all
回调来确定何时解决所有承诺?
您可以尝试这样的操作:
iframe.contentWindow.document.querySelectorAll("link[rel=stylesheet]")).forEach(link=> {
// change to arrow function to fix closure scoping issues
link.href = link.href.replace(/\?.*|$/, "?v=4");
styleSheetPromises.push(new Promise((resolve, reject)=>{
// Only resolve the promise when the stylesheet is loaded
link.addEventListener('load', resolve)
}));
}
不需要事件侦听器的替代方法:
for (var link of iframe.contentWindow.document.querySelectorAll("link[rel=stylesheet]")) {
styleSheetPromises.push(new Promise((resolve, reject) => {
link.onload = function () {
console.log('stylesheet loaded')
resolve()
}
}))
link.href = link.href.replace(/\?.*|$/, "?v=4")
}
Promise.all(styleSheetPromises).then((values) => {
console.log('All stylesheets are loaded')
});
我正在尝试将多个承诺链接到 Promise.all([...])
并在 onload
回调中激活每个承诺。我的代码:
var styleSheetPromises = []
// styles version
for (var link of iframe.contentWindow.document.querySelectorAll("link[rel=stylesheet]")) {
//var linkPromise = new Promise((resolve) => resolve())
var linkPromise = () => new Promise((resolve) => resolve())
styleSheetPromises.push(linkPromise)
link.onload = function () {
console.log('stylesheet loaded')
//linkPromise()
}
link.href = link.href.replace(/\?.*|$/, "?v=4")
}
Promise.all(styleSheetPromises).then((values) => {
console.log('All stylesheets are loaded')
});
以上代码在 iframe 中附加样式表的版本,并确定何时加载所有样式表 Promise.all
。
我的代码中的问题是 Promise.all
没有在 onload 事件回调中调用 linkPromise()
就激活了。将在“加载样式表”之前记录“加载所有样式表”。
我如何正确链接承诺并在 onload
事件中激活它们并使用 Promise.all
回调来确定何时解决所有承诺?
您可以尝试这样的操作:
iframe.contentWindow.document.querySelectorAll("link[rel=stylesheet]")).forEach(link=> {
// change to arrow function to fix closure scoping issues
link.href = link.href.replace(/\?.*|$/, "?v=4");
styleSheetPromises.push(new Promise((resolve, reject)=>{
// Only resolve the promise when the stylesheet is loaded
link.addEventListener('load', resolve)
}));
}
不需要事件侦听器的替代方法:
for (var link of iframe.contentWindow.document.querySelectorAll("link[rel=stylesheet]")) {
styleSheetPromises.push(new Promise((resolve, reject) => {
link.onload = function () {
console.log('stylesheet loaded')
resolve()
}
}))
link.href = link.href.replace(/\?.*|$/, "?v=4")
}
Promise.all(styleSheetPromises).then((values) => {
console.log('All stylesheets are loaded')
});