gpt4 book ai didi

javascript - Cordova/UWP - 如何顺序处理 Promise 并编写例程来递归复制文件夹

转载 作者:行者123 更新时间:2023-11-28 04:28:06 26 4
gpt4 key购买 nike

我无法找出使用 promises 的最佳方式。我正在尝试创建一个例程来复制文件夹,并且我发现自己正在尝试按顺序处理 promise 。我编写的代码不太优雅:

copyFolder = function( source, target ) {
var deferred = $q.defer();

var sourceFolder = null;
var sourcePromise = Windows.Storage.KnownFolders.documentsLibrary.getFolderAsync(sourcePath)

sourcePromise.then(function(dir) {
sourceFolder = dir;
}, function(error) {
return
});

var targetFolder = null;
var targetPromise = Windows.Storage.KnownFolders.documentsLibrary.getFolderAsync(targetPath)

targetPromise.then(function(dir) {
targetFolder = dir;
}

$q.all( sourcePromise, targetPromise ).then( function() {
if ( !targetFolder ) {
var createPromise = Windows.Storage.KnownFolders.documentsLibrary.createFolderAsync(targetPath)

createPromise.then(function(dir) {
targetFolder = dir;
}
}

createPromise.then( function() {
deferred.resolve( copyFolderRecursively(sourceFolder, targetFolder) );
});
});

return deferred.promise;
}

请注意,我正在复制 Documents 文件夹中的文件,因此无法使用 cordova-plugin-file

对于targetFolder,我检查它是否存在(targetPromise)。如果没有,我会创建它 (createPromise)。我喜欢 $q.all() 调用的想法,遗憾的是它不能用于 createPromise

最重要的是,我正在尝试创建一个递归函数,该函数将在复制所有文件后返回。实际上,如果它能够返回一个 Promise(或构建一个 Promise 列表),那就更好了。

这段代码可以写成更优雅的形式吗?另外,是否有一个我可以遵循的实现 promise 的递归函数的示例?

最佳答案

我意识到我可以创建一个依赖于另一个 promise 的 promise 并等待:

var targetFolder = null;
var targetPromise = Windows.Storage.KnownFolders.documentsLibrary.getFolderAsync( target ).then( function() {
return Windows.Storage.KnownFolders.documentsLibrary.getFolderAsync( target );
}, function(error) {
return Windows.Storage.KnownFolders.documentsLibrary.createFolderAsync( target );
});

targetPromise.then( function(folder) {
targetFolder = folder;
});

这并不理想,但我将对 getFolderAsync 的第一次调用视为“存在”调用。然后使用成功回调返回 getFolderAsync 的结果。如果“exists”失败,则会调用 createFolderAsync。这意味着 $q.all( sourcePromise, targetPromise ) 将等待,直到检索(或创建)文件夹。为了简单起见,我只是检查 targetFolder 是否已定义,而不是捕获 createFolderAsync 的失败回调。

尽管这在技术上回答了我问题的第一部分。我意识到以下内容更加简洁:

var replace = Windows.Storage.CreationCollisionOption.replaceExisting;

var targetFolder = null;
var targetPromise = Windows.Storage.KnownFolders.documentsLibrary.createFolderAsync(target, replace);

targetPromise.then( function(folder) {
targetFolder = folder;
});

我不确定的是 targetPromise.then 是否在 $q.all (在函数末尾使用)之前按顺序执行。它似乎有效,但我不确定它是否应该有效。

我还创建了一个函数,它将生成 promise 并等待每个复制操作(在解决单个延迟 promise 之前)。这只是第一个有效的版本。任何有关如何改进它的建议将不胜感激:

$scope.copyFolderRecursively = function(sourceFolder, targetFolder) {
function CopySubFolders(sourcefolder, targetFolder) {
var deferred = $q.defer();

if ( !sourceFolder ) return false;

var promises = [];

// Copy the files
var getFilesPromise = sourceFolder.getFilesAsync();
var copyFilesPromise = getFilesPromise.then(function (files) {
if ( files ) {
files.forEach(function (file) {
console.log("copy file: " + file.displayName);

var delayed = $q.defer();
promises.push( delayed.promise );

file.copyAsync(targetFolder).then( function(copiedfile) {
delayed.resolve( copiedfile );
}, function(error) {
delayed.reject( "Error copying file" + file.path );
});
});
}
});

// Recursively copy each subfolder
var getFoldersPromise = sourceFolder.getFoldersAsync();
var copyFoldersPromise = getFoldersPromise.then(function (folders) {
if ( folders ) {
folders.forEach(function (folder) {
var replace = Windows.Storage.CreationCollisionOption.replaceExisting;
console.log("create folder: " + folder.name);

var delayed = $q.defer();
promises.push( delayed.promise );

targetFolder.createFolderAsync(folder.name, replace).then(function (newFolder) {
CopySubFolders(folder, newFolder).then( function(success) {
delayed.resolve( newFolder );
}, function(error) {
delayed.reject( "Error copying folder " + newFolder.path );
});
});
});
}
});

$q.all( getFilesPromise, copyFilesPromise, getFoldersPromise, copyFoldersPromise, promises ).then( function() {
return $q.all( promises );
}).then( function() {
deferred.resolve( true );
}, function(error) {
deferred.resolve( false );
});

return deferred.promise;
}

return CopySubFolders( sourceFolder, targetFolder );
}

此解决方案值得注意的一件事(另一个实现),UWP promises不是Angularjs promises 。我基本上将每个 UWP 调用转换为 AngularJS 延迟 promise - 所以我可以使用 $q.all()

关于javascript - Cordova/UWP - 如何顺序处理 Promise 并编写例程来递归复制文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44866344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com