一 h5对文件进行操作,需要获得,操作后的结果来作为循环的执行条件,进行下一步操作,但由于plus.io.resolveLocalFileSystemURL()方法是异步调用,导致结果没有返回,下一次循环就开始执行.
百度方法1:.async/await方式
export const getUserToken = () => new Promise((resolve, reject) => {
setupWebViewJavascriptBridge((bridge) => {
bridge.callHandler(‘fetchUserInfo’, (data) => {
resolve(data)
})
})
})
async function(){ //注意await
外层函数需要有data
标识,表示里面是异步
const data = await getUserToken()
console.log(data )
用法挺简单,然而在本次项目中并不能用来;
2:ES 6中原生提供了Promise对象,Promise对象代表了某个未来才会知道结果的事件(一般是一个异步操作),并且这个事件对外提供了统一的API,可供进一步处理。
使用Promise对象可以用同步操作的流程写法来表达异步操作,避免了层层嵌套的异步回调,代码也更加清晰易懂,方便维护。
Promise.prototype.then()
没有去尝试,但应该是个解决途径
3:递归解决,恶心
function digui(fragmentFile,list,fragmentFolder,lis,names,files,paths,t,pResult,name3){
if(pResult != "全部"){
plus.io.resolveLocalFileSystemURL(paths[t],function(entry)
{
console.log(paths[t]);
entry.file( function(file2){
var fileReader = new plus.io.FileReader();
fileReader.readAsText(file2, 'utf-8');
fileReader.onloadend = function(evt) {
let result = evt.target.result;
let arr = result.split("=");
console.log(arr);
if(arr.length > 1 && arr[1].indexOf(pResult) !=-1){
console.log(11111)
flag = true;
var name=names[t];
var li=lis[t];
if(name3.indexOf(name)==-1){
li=innerHtml(files[t],li,name);
fragmentFolder.appendChild(li);
name3=name3+name+",";
}
lis[t]=li;
}
t++;
if(t<names.length){
digui(fragmentFile,list,fragmentFolder,lis,names,files,paths,t,pResult,name3);
} else{
list.appendChild(fragmentFolder);
list.appendChild(fragmentFile);
mask.close();
document.querySelector('.loading').style.display = 'none';
}
}
} );
})
}else{
for(let j=0;j<names.length;j++){
var name=names[j];
var li=lis[j];
li=innerHtml(files[j],li,name);
lis[j]=li;
fragmentFolder.appendChild(li);
}
list.appendChild(fragmentFolder);
list.appendChild(fragmentFile);
mask.close();
document.querySelector('.loading').style.display = 'none';
}
}