中途停止承诺链

Posted

技术标签:

【中文标题】中途停止承诺链【英文标题】:Stopping the promise chain midway 【发布时间】:2014-12-29 09:28:52 【问题描述】:

我正试图(捕获后)。因此,在第一个承诺中发生错误后,catch 会捕获它,但我不希望链继续。我用的是蓝鸟。我该怎么做?

getRedirectedURL(url).then(function(url) 
                console.log(1);
                url = domainCleanse(url);
                sql = mysql.format(select, url);

                return [ url, mysqlQuery(sql) ];

            ).catch(function(error) 
                console.log(2);
                console.error(error);
                socket.emit('error:unreachable', url + ' was unreachable');
            ).spread(function(url, rows) 
                console.log(3);
                if(_.isEmpty(rows[0])) 
                    socketList.push(
                        url: url,
                        ttl: _.now(),
                        socket: socket,
                        added: false
                    );
                 else 
                    socket.emit('done', mapResults(rows[0]));
                
            ).catch(function(error) 
                console.log(4);
                console.error(error);
                socket.emit('error', 'We could not reach ' + url + ' at this time.');
            );

【问题讨论】:

Handling multiple catches in promise chain的可能重复 也可以看看Break promise chain and call a function based on the step in the chain where it is broken 【参考方案1】:

概括你的例子,它看起来像这样:

promiseToFoo()
    .then(promiseToBar)
    .catch(failedToFooOrBar)
    .then(promiseToFrob)
    .catch(failedToFrob)

沿着幸福的道路,你向 Foo 承诺,然后是 Bar,然后是 Frob。根据您的描述,您希望将错误 Fooing 或 Barring 与错误 Frobbing 分开处理。因此,一个简单的解决方案是将 Frob 的错误处理嵌入到该承诺中。因此,不是将 Promise 链接到 Frob,而是将 Promise 链接到 Frob 处理 Frobbing 中的错误。像这样的:

promiseToFoo()
    .then(promiseToBar)
    .catch(function (error) 
        failedToFooOrBar(error);
        return Promise.reject(error);
    )
    .then(function (x) 
        return promiseToFrob(x).catch(failedToFrob);
    );

这样做的关键是确保您在第一个catch 中的拒绝处理程序在离开时最终使链处于拒绝状态。这在上面的示例中通过从处理程序返回一个被拒绝的 Promise 来处理。您也可以通过从处理程序中抛出错误来处理它。如果你不做这些事情之一,那么当处理程序完成时,promise 将处于已完成状态,并且将调用后续 then 调用提供的 on-fulfill 处理程序。

【讨论】:

以上是关于中途停止承诺链的主要内容,如果未能解决你的问题,请参考以下文章

动画视图并中途停止

iOS UITableview 滚动中途停止

中途停止悬停()

python 中途停止发电机

StreamWriter 在写入文本文件中途停止写入

即使您在中途停止悬停,如何强制动画完成然后反转以开始悬停?