问题描述
在扩展程序中,我试图获取一组本地资源,并将它们从本地html文件的页面脚本传递到其内容脚本,再传递到后台脚本,最后传递到扩展页面以进行显示。因为资源是本地的,所以它以页面脚本开始。
如果获取了一个资源,则该资源将正常运行,并且扩展页面将显示该资源。当资源数组的长度大于1时,它仅在写出提取请求时才起作用,就像事先知道该长度一样。如果使用array.map
将资源路径数组转换为要在Promise.all中使用的获取数组,则获取数据到达后台脚本时为空,尽管页面和内容中的所有日志脚本显示文件。
代码在下面。 con_script.return_fetch
是内容脚本中位于页面脚本窗口上的函数,使用cloneInto
将数据传递到后台脚本。 o
只是具有两个属性的对象,src
是源路径的数组,而caller
的选项卡的tab.id带有已加载的扩展页,该扩展页已加载以启动事件以请求显示资源。 Promise.all
添加第三个属性status
,具体取决于集合是否全部解析。
如果从此页面脚本或关联的内容脚本将o.src
写入控制台,则它应该是一个斑点数组。但是在后台脚本中,它包含路径而不是斑点。仅在使用Array.map
时会发生这种情况。
为什么使用Array.map
会导致在后台脚本中无法识别对对象o
的更改?我再说一遍,但是如果改用注释的Promise.all
,则完全相同的代码可以正常工作。但是,当然,每个请求中的资源数量是未知的。
除了Array.map
之外,还有其他方法可以将源数组转换为获取承诺数组吗?
谢谢。
Promise.all( o.src.map( ( v,i ) => { fetch_i( v,i ); } ) )
//Promise.all( [ fetch_i( o.src[ 0 ],0 ),fetch_i( o.src[ 1 ],1 ) ] )
.then( ( r ) =>
{
o.status = 'resolve';
window.con_script.return_fetch( o );
} )
.catch( ( e ) =>
{
o.status = 'reject';
o.src = e;
window.con_script.return_fetch( o );
} );
function fetch_i( v,i )
{
return new Promise( ( resolve,reject ) =>
{
fetch( v )
.then( response => response.blob() )
.then( ( myBlob ) =>
{
o.src[ i ] = myBlob; // Overwrite the source path with the blob.
resolve();
} )
.catch( ( e ) =>
{
reject( e );
} );
} ); // close promise
} // close fetch_i
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)