promiseall退出条件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了promiseall退出条件相关的知识,希望对你有一定的参考价值。

参考技术A promiseall退出需要一个对象去帮它解除。
Promise 是一个对象,它代表了一个异步操作的最终实现或者失败及其后果值。简略地说,Promise是一个示意当前某个时候会生成的值的占位符。
Promise 是解决异步操作的十分有用的对象。
JavaScript 提供了一个帮忙函数 Promise.all(promisesArrayOrIterable) 反对并行处理多个Promises,并且在一个聚合数组中获取后果值。我么一起来学习下Promise.all()是怎么工作的。
参考技术B 1、promise.all([])接收一个数组,如果数组里的promise操作含有catch方法,那么就算被reject,也不会触发promise.all的catch方法,因为每次catch都会新建一个new promise对象

2、如果没有catch,只要数组中有一个被reject掉,都会触发promise.all的catch,具体封装如下

思路:定义一个记录数组长度的变量,和一个记录增长的变量,数组每次成功执行resolve,则该变量+1,最后通过判断该变量和数组长度变量是否相等,来resolve,定义一个数组来保存每次的返回值,一旦有其中一个reject,直接停止,return出去

Oracle PL/SQL - 如果不满足条件,则退出开始结束块

【中文标题】Oracle PL/SQL - 如果不满足条件,则退出开始结束块【英文标题】:Oracle PL/SQL - Exit begin end block if condition is not met 【发布时间】:2020-11-21 09:03:03 【问题描述】:

如果不满足条件,是否可以退出/跳过 begin end 块?

例子:

DECLARE
    my_var BOOLEAN := TRUE;

BEGIN
    IF my_var THEN
        EXIT_BEGIN_END_HERE;  -- Exits the block but continue execution after it!
    END IF;

    -- Other stuff happens here. Won't be executed if IF above is true
    INSERT INTO asdf
    VALUES ('asdf', 'asdf');
END;

-- Other stuff happens here

【问题讨论】:

【参考方案1】:

使用带有标签的GOTO

BEGIN
  DECLARE
    my_var BOOLEAN := TRUE;
  BEGIN
    IF my_var THEN
      GOTO skip_insert;
    END IF;

    -- Other stuff happens here. Won't be executed if IF above is true
    DBMS_OUTPUT.PUT_LINE( 'This should be skipped' );
  END;
  <<skip_insert>>
    DBMS_OUTPUT.PUT_LINE( 'Continue from here.' );
END;
/

或者使用IF ... THEN ... ELSE ... END IF:

DECLARE
  my_var BOOLEAN := TRUE;
BEGIN
  IF my_var THEN
    NULL
  ELSE
    -- Other stuff happens here. Won't be executed if IF above is true
    DBMS_OUTPUT.PUT_LINE( 'This should be skipped' );
  END IF;

  DBMS_OUTPUT.PUT_LINE( 'Continue from here.' );
END;
/

这两个输出:

Continue from here.

db小提琴here

【讨论】:

【参考方案2】:

我认为以下是一个更好的示例(和解决方案),可以说明您要实现的目标。

DECLARE
    my_var BOOLEAN := TRUE;
BEGIN
    BEGIN
        IF my_var THEN
            RAISE PROGRAM_ERROR;
        END IF;
        -- Other stuff happens here. Won't be executed if IF above is true
        DBMS_OUTPUT.PUT_LINE('Not here!');
    EXCEPTION
        WHEN OTHERS THEN
            NULL;
    END;
    -- Other stuff happens here
    DBMS_OUTPUT.PUT_LINE('Continuing.');
END;

您只想退出内部 BEGIN-END,对吗?所以你可以使用RAISE 语句。 如果你运行上面的代码,它会显示Continuing.

【讨论】:

您应该只捕获您提出的特定异常。 引发异常是为了发生错误;这会留下不好的代码气味,因为 OP 的代码中没有发生任何不好的事情,这是滥用异常来转移程序的流程。是的,它会起作用,但如果我正在执行代码审查,我会反对使用此方法(特别是如果您正在捕获 OTHERS 而不是捕获用户定义的异常)。【参考方案3】:

如果想从最外层退出,可以使用RETURN

DECLARE
    my_var BOOLEAN := TRUE;

BEGIN
    IF my_var THEN
        RETURN;  -- Exits the block but continue execution after it!
    END IF;

    -- Other stuff happens here. Won't be executed if IF above is true
    INSERT INTO asdf
    VALUES ('asdf', 'asdf');
END;

-- Other stuff happens here

请注意,正如@MT0 所指出的,由于它从最外面的块退出,因此不会执行下面的INSERT INTO asdf

DECLARE
    my_var BOOLEAN := TRUE;

BEGIN
    BEGIN
        IF my_var THEN
            RETURN;  -- Exits the outermost block but continue execution after it!
        END IF;

        INSERT INTO qwerty
        VALUES ('qwerty', 'qwerty');
    END;

    -- Other stuff happens here. Won't be executed if IF above is true
    INSERT INTO asdf
    VALUES ('asdf', 'asdf');
END;

-- Other stuff happens here

RETURN也可以在程序内部使用。

查看类似问题:Abort a PL/SQL program

【讨论】:

这不会从当前嵌套的 PL/SQL 块之后继续执行;它终止了最外面的块db<>fiddle @MT0 谢谢。我会用这些信息更新答案!

以上是关于promiseall退出条件的主要内容,如果未能解决你的问题,请参考以下文章

Promise笔记

以 Promise.all 为条件 [重复]

Perl6多线程3: Promise start / in / await

如何在打字稿中正确编写有条件的 promise.resolve?

React 帮助:在映射数组中使用 Promise 进行条件渲染 [关闭]

编写期望 Promise 但如果不满足条件则不返回任何内容的打字稿方法的正确方法是啥?