一尘不染

跳过Q Promises中的then函数的正确方法

node.js

在我的代码中,基于特定条件,我想跳到该done函数,而不管所有then函数如何。

该问题的原始版本在编辑中。 以下是我要处理的实际问题。抱歉给你带来不便

实际问题:

我正在读取文件并进行处理。如果文件的内容符合特定条件,则必须在文件系统上执行一系列操作(例如读取和写入几个文件),然后执行done功能。如果条件失败,
则必须跳过所有一系列操作,而必须done直接执行函数

result在所有then函数中都返回一个对象(让我说),然后在下一个then更新result并返回它。因此,当所有then操作完成后,done将具有累积量result。最后,done遗嘱处理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);
});

阅读 310

收藏
2020-07-07

共1个答案

一尘不染

这取决于要跳过的条件是什么,要执行的操作类型以及条件失败时整个事情的“有用性”。您可能可以在此处使用智能拒绝功能来传达消息。否则,我认为处理此问题的正确方法实际上是一组嵌套的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

2020-07-07