承诺解决但不开火
Promise resolves but doesn't fire
我创建了一个脚本,它循环遍历一堆文件夹并将它们分别处理到 webpack 包中。这很好用,除了我无法弄清楚为什么循环周围的 Promise
没有解析。
我尝试过的一些事情:
- 如果我在
resolve()
之前放置 console.log("hello world")
,在 } else { ... }
中,它会输出日志。
- 如果我将
resolve()
移出 } else { ... }
,它会解决,但我的 gulp 任务的其余部分不会继续(独立但相关的问题)。
如果能帮我解决这个问题,我将不胜感激。最相关的代码块在下面,其余代码在下面的 link。
// process all the script folders
const process_script_folders = () => {
return new Promise((resolve) => {
const FOLDER = script_folders.shift();
// lint all scripts, except for critical
if (FOLDER !== "critical") {
const linted = lint_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*");
merged_streams.add(linted);
}
process_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*").then((processed) => {
merged_streams.add(processed);
if (script_folders.length > 0) {
process_script_folders();
} else {
// @TODO figure out why this isn't resolving
resolve();
}
});
});
};
return process_script_folders().then(() => {
// ... do stuff
console.log("Testing"); // currently never output
});
我认为问题与您进行递归调用的方式有关。
试试看
if (script_folders.length > 0) {
process_script_folders().then(resolve);
} else {
resolve();
}
您正在递归调用您的承诺,但是这些承诺中的 none 将在最后一个承诺之外解决,因为您已将您的解决方案放在您的解决条款中。我认为如果你将 resolve 放在 else 之外并保持其余不变,它应该在完成递归后 resolve。
if (script_folders.length > 0) {
process_script_folders();
}
resolve();
你可以这样试试吗?
编辑:@Bergi 是对的。我认为像下面那样做应该让它正常工作。首先是我建议你做的一个小例子:
let i = 0
const example_processing = () => {
return new Promise((resolve) => {
i++
setTimeout(resolve, 1000);
}).then(() => {
console.log(i);
return i < 10 ? example_processing() : "done"
});
};
example_processing().then(console.log);
关于你的代码,我猜它看起来更像这样:
const process_script_folders = () => {
return new Promise((resolve) => {
const FOLDER = script_folders.shift();
// lint all scripts, except for critical
if (FOLDER !== "critical") {
const linted = lint_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*");
merged_streams.add(linted);
}
process_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*").then((processed) => {
merged_streams.add(processed);
resolve();
});
}).then(() => script_folder.length > 0 ? process_script_folders() : "done");
};
我创建了一个脚本,它循环遍历一堆文件夹并将它们分别处理到 webpack 包中。这很好用,除了我无法弄清楚为什么循环周围的 Promise
没有解析。
我尝试过的一些事情:
- 如果我在
resolve()
之前放置console.log("hello world")
,在} else { ... }
中,它会输出日志。 - 如果我将
resolve()
移出} else { ... }
,它会解决,但我的 gulp 任务的其余部分不会继续(独立但相关的问题)。
如果能帮我解决这个问题,我将不胜感激。最相关的代码块在下面,其余代码在下面的 link。
// process all the script folders
const process_script_folders = () => {
return new Promise((resolve) => {
const FOLDER = script_folders.shift();
// lint all scripts, except for critical
if (FOLDER !== "critical") {
const linted = lint_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*");
merged_streams.add(linted);
}
process_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*").then((processed) => {
merged_streams.add(processed);
if (script_folders.length > 0) {
process_script_folders();
} else {
// @TODO figure out why this isn't resolving
resolve();
}
});
});
};
return process_script_folders().then(() => {
// ... do stuff
console.log("Testing"); // currently never output
});
我认为问题与您进行递归调用的方式有关。
试试看
if (script_folders.length > 0) {
process_script_folders().then(resolve);
} else {
resolve();
}
您正在递归调用您的承诺,但是这些承诺中的 none 将在最后一个承诺之外解决,因为您已将您的解决方案放在您的解决条款中。我认为如果你将 resolve 放在 else 之外并保持其余不变,它应该在完成递归后 resolve。
if (script_folders.length > 0) {
process_script_folders();
}
resolve();
你可以这样试试吗?
编辑:@Bergi 是对的。我认为像下面那样做应该让它正常工作。首先是我建议你做的一个小例子:
let i = 0
const example_processing = () => {
return new Promise((resolve) => {
i++
setTimeout(resolve, 1000);
}).then(() => {
console.log(i);
return i < 10 ? example_processing() : "done"
});
};
example_processing().then(console.log);
关于你的代码,我猜它看起来更像这样:
const process_script_folders = () => {
return new Promise((resolve) => {
const FOLDER = script_folders.shift();
// lint all scripts, except for critical
if (FOLDER !== "critical") {
const linted = lint_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*");
merged_streams.add(linted);
}
process_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*").then((processed) => {
merged_streams.add(processed);
resolve();
});
}).then(() => script_folder.length > 0 ? process_script_folders() : "done");
};