gpt4 book ai didi

javascript - 从 for 循环内部返回一个 promise

转载 作者:行者123 更新时间:2023-11-28 15:36:05 24 4
gpt4 key购买 nike

我有一个递归函数,我试图让它按顺序运行,每次都返回 promise 。该代码是递归的并且运行良好,但仅适用于 for 循环中的第一项。

示例:

  • 文件夹:1 - 确定
  • 文件夹:11 - 好的
  • 文件夹:111 - 好的
  • 文件夹:111 - 好的
  • 文件夹:2 - 不行
  • 文件夹:12 - 不行
  • 所有异步下载均按顺序完成。

我认为这是因为当我从内部返回 Promise 时,for 循环就会被中断。

function CopySubFolders(folder, destFolder) {

// Recursively copy each subfolder
return folder.getFoldersAsync()
.then(function (folderlist) {
if (folderlist.size > 0) {
for (var i in folderlist) {
var replace = Windows.Storage.CreationCollisionOption.replaceExisting;
console.log("create folder: " + folderlist[i].name);

return destFolder.createFolderAsync(folderlist[i].name, replace)
.then(function (newdest) {
return CopySubFolders(folderlist[i], newdest);
});
}
}
else {
return WinJS.Promise.as();
}
});
}


CopySubFolders(folder, self.localFolder)
.then(function () {
completeFunc("Done");
console.log("All asynchronous downloads completed in sequence.");
})

知道如何在不中断 for 循环的情况下返回 promise 吗?

PS:如果我使用 forEach loo,它不会被中断,但是我会失去按顺序返回文件夹的能力。

示例:

  • 文件夹:1 - 确定
  • 所有异步下载均按顺序完成。
  • 文件夹:11 - 确定
  • 文件夹:111 - 好的
  • 文件夹:111 - 好的
  • 文件夹:2 - 确定
  • 文件夹:12 - 确定

最佳答案

是的,就像任何函数一样,如果您执行return语句,该函数将停止正在执行的操作并返回。您应该能够通过以下方式完成您想要做的事情:

编辑:如果您不需要它们按特定顺序完成,您可以使用 WinJS.Promise.join() 完成您想要做的事情(在其他 Promise 方言中也称为 Promise.all())和 map (我在这里分解出内部部分以减少嵌套):

function CopySubFolders(folder, destFolder) {
return folder.getFoldersAsync()
.then(function (folderlist) {
return WinJS.Promise.join(folderlist.map(function (folder) {
return CopyFolder(folder, destFolder);
});
});
}

function CopyFolder(folder, destFolder) {
var replace = Windows.Storage.CreationCollisionOption.replaceExisting;
console.log("create folder: " + folder.name);

return destFolder.createFolderAsync(folder.name, replace)
.then(function (newdest) {
return CopySubFolders(folder, newdest);
});
}

作为完整的旁注,请不要将 for...in 与数组一起使用。这是一个坏主意。

作为这篇文章的一点痕迹,如果需要的话,您可以按照以下顺序创建文件夹(尽管不建议这样做):

function CopySubFolders(folder, destFolder) {
var p = Promise.resolve();

return folder.getFoldersAsync()
.then(function (folderlist) {
return folderlist.forEach(function (folder) {
var replace = Windows.Storage.CreationCollisionOption.replaceExisting;
console.log("create folder: " + folder.name);

p = p.then(function () {
destFolder.createFolderAsync(folder.name, replace)
.then(function (newdest) {
return CopySubFolders(folder, newdest);
});
});
});
});

return p;
}

另一种稍微更简洁的方式来做同样的事情,如图所示here ,就是使用folderlist.reduce():

function CopySubFolders(folder, destFolder) {
return folder.getFoldersAsync()
.then(function (folderlist) {
return folderlist.reduce(function (sequence, folder) {
var replace = Windows.Storage.CreationCollisionOption.replaceExisting;
console.log("create folder: " + folder.name);

return sequence.then(function () {
destFolder.createFolderAsync(folder.name, replace)
.then(function (newdest) {
return CopySubFolders(folder, newdest);
});
});
}, Promise.resolve());
});
}

关于javascript - 从 for 循环内部返回一个 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25605215/

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