我想检查文件是否存在,如果不存在,请下载它。我在this SO question和this blog post
中尝试过建议的解决方案但这些解决方案都不适合我。这是基于SO问题的代码:
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
console.log("gotFS");
getFolder(fileSystem, video.folderName, function(folder) {
console.log("Got folder");
var filePath = folder.toURL() + "\/" + "videotest.mp4";
fileSystem.root.getFile(filePath, { create: false }, playVideo(filePath, true), transferFile(video.uri, filePath));
}, function() {
console.log("failed to get folder");
});
},
function() {
console.log("failed to get filesystem");
});
播放视频功能如下:
function playVideo(uri, hasBeenDownloaded) {
console.log("was video dowloaded already", hasBeenDownloaded);
var player = document.getElementById("videoPlayer");
var source = document.createElement("source");
source.src = uri;
source.type = "video/mp4";
player.appendChild(source);
player.load();
}
这里是transferFile函数:
function transferFile(uri, filePath) {
var transfer = new FileTransfer();
transfer.download(
uri,
filePath,
function (entry) {
var targetPath = entry.toURL();
console.log("target path je", targetPath);
document.getElementById("result").innerHTML = "File saved to: " + targetPath;
playVideo(targetPath, false);
},
function (error) {
document.getElementById("result").innerHTML = "An error has occurred: Code = " + error.code;
console.log("download error source " + error.source);
console.log("download error target " + error.target);
console.log("upload error code" + error.code);
}
);
}
无论文件是否存在,会发生playVideo和transferFile的调用。
例如,如果文件已存在,则首先只调用playVideo,并在控制台中记录:
was video dowloaded already: true
过了一段时间后,我看到调用了transferFile函数,当下载文件时,它将调用playVideo,在控制台中我可以看到:
was video dowloaded already: false
那为什么会这样呢?
P.S。
在博客文章中建议的代码完全相同,即两个函数都被调用。
答案 0 :(得分:1)
您的代码将调用函数作为回调传递,而不是函数本身。让我举个例子。想象一下你有Foo的功能。它要求你传递2个回调函数 - 一个用于成功,一个用于失败。你可以这样做:
function good() { alert('good'); };
function bad() { alert('bad'); };
foo(good, bad);
然而,这就是你所做的:
foo(good(), bad());
这就是你们两个被召唤的原因。你需要改变:
fileSystem.root.getFile(filePath, { create: false }, playVideo(filePath, true), transferFile(video.uri, filePath));
到
fileSystem.root.getFile(filePath, { create: false }, playVideo, transferFile);
这意味着您需要访问您不需要作为参数但作为常规变量的值。