Javascript 如何按顺序加载这些iframe?
我有一个很大的字符串数组,每个字符串都应该生成/加载一个iframe。其思想是按顺序加载每个iframe:Javascript 如何按顺序加载这些iframe?,javascript,Javascript,我有一个很大的字符串数组,每个字符串都应该生成/加载一个iframe。其思想是按顺序加载每个iframe:iframe1已加载→ 开始加载iframe 2。。。等等 我想通过将数组划分为块并并行运行来划分负载。但是,我不知道如何在此设置中按顺序运行每个块的内容 块[0]→ 加载iframe 1→ iframe 1已加载→ 加载iframe 2→ iframe 2已加载→ 完成 块[1]→ 加载iframe 3→ iframe 3已加载→ 加载iframe 4→ iframe 4已加载→ 完成 块
iframe1已加载→ 开始加载iframe 2。。。等等
我想通过将数组划分为块并并行运行来划分负载。但是,我不知道如何在此设置中按顺序运行每个块的内容
var promiseArray=[];
var urlParams=[1,2,3,4,5,6,7,8,9,10];
var maxLength=urlParams.length/5;
var chunks=divideArray(urlparms,maxLength);
对于(var chunkIndex=0;chunkIndex{
var urlParam=urlParams[paramIndex];
变量iframe=$('');
iframe.prependTo(“正文”);
iframe.on(“加载”,函数(){
//var iframeBody=iframe.contents().find('body');
iframe.remove();
log('Iframe-'+urlParam);
解析('Iframe-'+urlParam+'loaded');
});
})
)
}
}
promiseArray.then(函数(结果){
控制台日志(结果);
});
函数divideArray(数组,maxLength){
var chunks=[];
对于(变量i=0;i
使用原始承诺链接异步操作相当麻烦,但以下是如何使用异步
函数:
async
函数中的代码async
函数,为块中的每个URL顺序调用第一个函数Promise.all
var promiseArray = [];
var urlParams = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var maxLength = urlParams.length / 5;
var chunks = divideArray(urlParams, maxLength);
for (var chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
var urlParams = chunks[chunkIndex];
console.log('Chunk-' + chunkIndex);
promiseArray.push(processChunk(urlParams));
}
Promise.all(promiseArray).then(function (result) {
console.log(result);
});
async function processURL(urlParam) {
return new Promise((resolve, reject) => {
var iframe = $('<iframe src="https://gist.github.com/joonaspaakko/414c4a43ac092f562e07e1642fa75dc5.pibb?val=' + urlParam + '"></iframe>');
iframe.prependTo('body');
iframe.on("load", function () {
console.log('Iframe-' + urlParam);
resolve('Iframe-' + urlParam + ' loaded.');
});
});
}
async function processChunk(chunk) {
var urlResults = [];
for (var paramIndex = 0; paramIndex < urlParams.length; paramIndex++) {
var urlResult = await processURL(chunk[paramIndex]);
urlResults.push(urlResult);
}
return urlResults;
}
function divideArray(array, maxLength) {
var chunks = [];
for (var i = 0; i < array.length; i += maxLength) {
chunks.push(array.slice(i, i + maxLength));
}
return chunks;
}
var promiseArray=[];
var urlParams=[1,2,3,4,5,6,7,8,9,10];
var maxLength=urlParams.length/5;
var chunks=divideArray(urlparms,maxLength);
对于(var chunkIndex=0;chunkIndex{
变量iframe=$('');
iframe.prependTo(“正文”);
iframe.on(“加载”,函数(){
log('Iframe-'+urlParam);
解析('Iframe-'+urlParam+'loaded');
});
});
}
异步函数processChunk(块){
var urlResults=[];
对于(var paramIndex=0;paramIndex
使用此方便的实用程序功能:
/**
* Given an Iterable (an array, for example), or a promise of an Iterable,
* iterates serially over all the values in it, executing the given iterator on each element.
*
* @tutorial https://stackoverflow.com/a/41608207/3563013
* @tutorial http://bluebirdjs.com/docs/api/promise.each.html
* @tutorial https://jsfiddle.net/mckabue/zmf3tL9k/11/ - you can queue mapped promises
*
* @param { Iterable<any> | Promise<Iterable<any>> } items
* @param { Function } fn
* @param {*} options
*/
export default function promiseEach(items, fn, options) {
options = Object.assign({}, {
continueOnFail: false,
startValue: undefined,
nonArrayError: "Non array passed to each",
emptyArrayResolveValue: undefined
}, options);
// invalid input
if (!Array.isArray(items)) {
return Promise.reject(new Error(options.nonArrayError));
}
// empty case
if (items.length === 0) {
return Promise.resolve(options.emptyArrayResolveValue);
}
return items.reduce((accumulator, currentValue, currentIndex, array) => {
return accumulator[!!options.continueOnFail ? 'finally' : 'then'](function () {
return fn(currentValue, currentIndex, array);
});
}, Promise.resolve(options.startValue));
}
/**
* Given an Iterable (an array, for example), or a promise of an Iterable,
* iterates serially over all the values in it, executing the given iterator on each element.
*
* @tutorial https://stackoverflow.com/a/41608207/3563013
* @tutorial http://bluebirdjs.com/docs/api/promise.each.html
* @tutorial https://jsfiddle.net/mckabue/zmf3tL9k/11/ - you can queue mapped promises
*
* @param { Iterable<any> | Promise<Iterable<any>> } items
* @param { Function } fn
* @param {*} options
*/
export default function promiseEach(items, fn, options) {
options = Object.assign({}, {
continueOnFail: false,
startValue: undefined,
nonArrayError: "Non array passed to each",
emptyArrayResolveValue: undefined
}, options);
// invalid input
if (!Array.isArray(items)) {
return Promise.reject(new Error(options.nonArrayError));
}
// empty case
if (items.length === 0) {
return Promise.resolve(options.emptyArrayResolveValue);
}
return items.reduce((accumulator, currentValue, currentIndex, array) => {
return accumulator[!!options.continueOnFail ? 'finally' : 'then'](function () {
return fn(currentValue, currentIndex, array);
});
}, Promise.resolve(options.startValue));
}