当前位置: 首页 > 知识库问答 >
问题:

Javascriptpromise如何进行解析后清理

萧霍英
2023-03-14

我正在为如何处理这个特殊案件而挣扎。我知道我可以通过链式回调来解决这个问题,但它看起来就像是promise的海报:

我有一个父方法,它需要按顺序执行三个异步操作(特别是从用户那里得到确认)。我们称它们为func1 func2和func3。现在,我可以让每一个都返回一个promise,并将其链接起来,这一切都非常有效。我遇到的问题是:

func1需要设置一个状态,等待链的其余部分运行,然后取消设置该状态。

演示伪代码:

function wrapper(){
    func1()
        .then(func2())
        .then(func3());
}
function func1(){
    return new Promise(function(resolve, reject){
        //do some async stuff that itself returns a promise :)
        async1().then(function(value){
            //set some global states based on the value for the duration of this chain
            resolve(); //Note NOT returning value as it's irrelevant to the other functions
            //!!! clean up the global states regardless of future failure or success, but after one of those.
        }, reject); //if async1 rejects, just pass that right up.
    });
}
function func2(){
    //do some logic here to decide which asyn function to call
    if (/*evaluates to */true){
        return async2(); //another async function that returns a promise, yay!
    } else {
        return async2_1(); //also returns a promise.
    }
}
function func3(){
    //do some dom updates to let the user know what's going on
    return Promise.resolve(async3()).then(function(){
        //update the dom to let them know that everything went well.
    });//returns this promise chain as a promise which the other chain will use.
}

我正在努力解决的部分是func1中resolve()之后的行;注意,正如前面所说的,我在func1中调用的async1确实返回了一个promise,所以我已经在这里处理了很多promise。我需要在func3返回的promise解决后进行清理。

理想情况下,这将以某种方式包含在func1中,但我也可以使用半全局变量(整个块将包装在一个更大的函数中)。

共有1个答案

秦滨海
2023-03-14

您将希望使用处置器模式(并避免Promise构造函数反模式):

function with1(callback) {
    return async1() // do some async stuff that itself returns a promise :)
    .then(function(value) {
        // set some global states based on the value for the duration of this chain
        const result = Promise.resolve(value) // or whatever
        .then(callback);

        return result.then(cleanup, cleanup);
        function cleanup() {
            // clean up the global states regardless of the failure or success of result
            return result;
        }
    });
}

你可以这样使用它

function wrapper() {
    with1(() =>
        func2().then(func3) // whatever should run in the altered context
    );
}
 类似资料:
  • 问题内容: 我正在使用共享内存的程序上工作。所述程序的多个实例将连接到现有程序或重新创建它,并在没有其他进程的情况下将其返回给OS,或者只是将其分离并终止。我想到了使用一个简单的计数器来跟踪使用它的进程数。 我正在使用函数进行清理,但是afaik在收到SIGKILL信号后,进程将不会进行任何清理,因此,如果这些进程中的任何一个不能正常终止,我可能永远无法清理内存。 有没有办法指定即使在SIGKIL

  • 我在测试中到处使用这种模式(不仅仅是加载URL),主要是为了允许发生对DOM的更改(例如mimick单击按钮,并等待divs隐藏和显示)。 这种设计的缺点是,我总是用几行代码编写匿名函数。此外,虽然我有一个解决方案(QUnit的),但定义promise的测试函数在promise运行之前完成。 我想知道是否有任何方法可以从中获取值,或者等待(block/sleep)直到它解决为止,类似于.NET的。

  • 我显然误解了jspromise的解决方式或“返回”的语义 我被一个期望我是同步的函数调用——返回一个值。计算该值需要一些异步代码(特别是dstore集合上的ForEach方法) 我试图实现的大致是这个,但这不起作用,因为函数mySynchronousFunction没有返回值。 我知道JS必须允许单线程实现,所以阻止它并不酷,但必须有某种模式用于将异步代码粘合到同步代码,我刚刚错过了这种模式。

  • 问题内容: 我需要清理生产服务器中的PostgreSQL数据库。我是新来的。所以任何人都知道PostgreSQL的步骤,请指导我。 我认为在生产服务器中提高PostgreSQL的性能非常有用。 问题答案: 连接到数据库并发出以下命令:“ VACUUM”。这导致可以在正常生产使用期间使用的“惰性模式”运行。建议您实际将其作为“真空分析”来调用,这也会更新统计信息。 如果要查看大量详细信息,可以在控制

  • 我在这里看到了:在Maven/Surefire中,什么是清理单元测试后的好方法,无论测试是否通过?但这帮不了我。我可能错误地配置了failsafe和/或surefire。 我已经将jUnit声明为依赖项 我在构建中有故障安全插件: 我没有任何遵循*IT命名约定的集成测试,只有遵循*Test命名约定的jUnit测试。我只是试图使用故障安全作为一种方法来确保我的清理完成。我试过船长是真的,我试过评论这

  • 所以我想知道promise的回应和拒绝对象是怎么回事。我正在阅读这份文档,有些事情我还不清楚。 例如,对象是关于什么的。 我已经看到这个东西可以包含在一个字符串中,然后启动?发生了什么事?这有什么意义 我最初认为只要回调函数返回一个值,解析函数/对象就会启动,然后它就可以转到 所以我在这件事上玩了一段时间,结果证明,我的理论中有50%的时间是有效的,另外50%的时间让我崩溃。 还有拒绝对象/函数,