在我的代码中,基于特定条件,我想跳到该done函数,而不管所有then函数如何。
done
then
该问题的原始版本在编辑中。 以下是我要处理的实际问题。抱歉给你带来不便
实际问题:
我正在读取文件并进行处理。如果文件的内容符合特定条件,则必须在文件系统上执行一系列操作(例如读取和写入几个文件),然后执行done功能。如果条件失败, 则必须跳过所有一系列操作,而必须done直接执行函数。
我result在所有then函数中都返回一个对象(让我说),然后在下一个then更新result并返回它。因此,当所有then操作完成后,done将具有累积量result。最后,done遗嘱处理result并打印。
result
因此,如果最初不满足条件,done将仅打印result(将为空)。
Q() .then(readFile) .then(function (contents) { var processResult = process the contents; if (processResult) { return {}; } else { // How can I skip to `done` from here } }) .then(function (results) { // do some more processing and update results return results; }) ... // Few more then functions similar to the one above ... .fail(function (exception) { console.error(exception.stack); }) .done(function (results) { // do some more processing and update results console.log(results); });
这取决于要跳过的条件是什么,要执行的操作类型以及条件失败时整个事情的“有用性”。您可能可以在此处使用智能拒绝功能来传达消息。否则,我认为处理此问题的正确方法实际上是一组嵌套的promise调用。
这也符合 promises背后 的 核心思想 ,即将同步控制结构带回异步代码执行。通常,在使用Promise时,您应该首先考虑如何 使用同步代码 完成任务。如果您考虑自己的情况,它可能会像这样工作:
var contents = readFromFile(); var results = initialOperation(contents); if (fancyCondition(results)) { results = doSomething(results); results = doMore(results); } processAndPrint(results);
因此,您将在同步代码中找到一个真正的分支。因此,在使用诺言的异步代码中避免这种情况是没有意义的。如果您可以 跳过 某些事情,那么您实际上是在使用gotos进行跳转。但是,您可以分支并分别做其他一些事情。
因此,回到promise和异步代码,使用另一组链接的操作来创建实际分支是完全可以的,并且本着promise背后的意图进行。因此,上面的代码可能如下所示:
readFromFile(fileName) .then(initialOperation) .then(function (results) { if (fancyCondition(results) { return doSomething(results) .then(doMore); } return results; }) .catch(errorHandler) .then(processResults) .then(outputResults); // Or `done` in Q
另请注意,当您开始使用自行返回承诺的函数而不是从中内联创建承诺时,promise管道会自动看起来更加干净then。