当前位置: 首页 > 面试题库 >

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

鲜于致远
2023-03-14
问题内容

在我的代码中,基于特定条件,我想跳到该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);
});

问题答案:

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



 类似资料:
  • 问题内容: 遍历一系列数字并跳过一个值的有效方法是什么?例如,范围是从0到100,而我想跳过50。 编辑:这是我正在使用的代码 问题答案: 您可以使用以下任何一种:

  • 问题内容: 您能否指出我跳过JavaScript中可选参数的好方法。 例如,我想在这里丢弃所有参数: 问题答案: 解: 您应该使用而不是要跳过的可选参数,因为这100%会模拟JavaScript中可选参数的默认值。 小例子: 强烈建议 :如果您有很多参数,请使用JSON,并且可以在参数列表的中间包含可选参数。看看这是如何在jQuery中完成的。

  • 我试图在匿名函数中使用某种if-then-else语句,该函数本身是的一部分。我有一个单元数组,其中包含许多双矩阵。我想用+1代替所有双矩阵中的正数,用-1代替所有负数。我想知道我是否可以使用匿名函数而不是编写一个单独的函数,然后从中调用? 以下是玩具示例: 我在找这样的东西: 我也试过了,但是,显然我不允许在匿名函数中加入等号。

  • 我对在r中用可选参数编写函数的“正确”方式感兴趣。随着时间的推移,我偶然发现了几段在这里采取不同路线的代码,并且我无法在这个主题上找到一个合适的(官方)位置。 到目前为止,我已经写了这样的可选参数: 如果仅提供 ,则该函数仅返回其参数。它对第二个参数使用默认的 值,如果该参数恰好不是 ,则该函数将两个数字相加。 或者,可以像这样编写函数(其中第二个参数需要按名称指定,但也可以或定义

  • 问题内容: 我一直在努力,但是我不明白。我是编程新手,所以几乎每个新步骤都是一个实验。尽管在没有参数/返回值的情况下调度正常的闭包没有问题,但到目前为止,我还不了解如何处理带有(多个)参数并最终返​​回的函数。 为了弄清楚适当的“解决方法”的逻辑,如果有人可以发布一个实际的示例,这样我就可以确定自己是否正确,那就太好了。我将非常感谢您提供的任何帮助…如果其他一些实际示例以更好的方式说明了该主题,请

  • 我有以下练习: 添加代码以使其正常运行。 我加了一个私人财产 和一个公共构造师 我添加了int-val,作为构造函数为MyVal分配一个非临时对象地址的一种方式,比如x。 有没有一个简洁(呃)的方法来回答这个练习?