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

如何回复。js通过失败链回调处理被拒绝的promise

权弘新
2023-03-14

Re:https://github.com/tildeio/rsvp.js

我有一个函数,名为do某物(),它做了一会儿事情,然后返回一个RSVP. Promise。然后,一个成功和失败的回调链被注册为返回的promise(见下面的代码)。我所期望的行为是,如果promise兑现,用promise注册的成功回调链将被解雇,如果promise被拒绝(失败),失败回调链将被解雇。

当promise兑现时,我会得到预期的行为,但当promise被拒绝时,我会得到与预期不同的行为。也就是说,成功回调被链接,并且一个成功回调的输出被传递到链中的下一个成功回调。但失败回调似乎没有链接。它们的行为几乎类似于try/catch块中的catch(参见下面的代码和输出)。

有人能解释这种行为吗?这真的是它的工作方式吗,或者这是rsvp方式中的一个错误。js处理一个被拒绝/失败的promise,该promise注册了一系列失败回调?我现在正在阅读promise/A规范,试图弄明白这一点,但如果有人对这件事了如指掌,我很想听听你的解释。提前谢谢。

jsfiddle:http://jsfiddle.net/rylie/VYSj7/2/

doSomething()  // returns an RSVP.Promise object
    .then(
        function(message) { console.log("then success 1: " + message); return "from success 1"; },  // success callback
        function(message) { console.log("then failure 1: " + message); return "from failure 1"; }   // failure callback
    )
    .then(
        function(message) { console.log("then success 2: " + message); return "from success 2"; },  // success callback
        function(message) { console.log("then failure 2: " + message); return "from failure 2"; }   // failure callback
    )
    .then(
        function(message) { console.log("then success 3: " + message); return "from success 3"; }   // success callback
    )
    .then(
        null,
        function(message) { console.log("then failure 4: " + message); return "from failure 4"; }   // failure callback
    )
    .then(
        function(message) { console.log("then success 5: " + message); return "from success 5"; },  // success callback
        function(message) { console.log("then failure 5: " + message); return "from failure 5"; }   // failure callback
    );

**当promise兑现(成功)时,这是我得到和期待的输出:

then success 1: Promise fulfilled!
then success 2: from success 1
then success 3: from success 2
then success 5: from success 3 

**当promise被拒绝(失败)时,这是我得到的输出:

then failure 1: Promise rejected!
then success 2: from failure 1
then success 3: from success 2
then success 5: from success 3 

**这是我所期望的(在拒绝/失败的promise上):

then failure 1: Promise rejected!
then failure 2: from failure 1
then failure 4: from failure 2
then failure 5: from failure 4    

共有1个答案

段干靖
2023-03-14

你应该忘记. so()甚至需要一个以上的参数,并使用. cat方法,这将更有意义。

promise提供了与某些同步代码构造的对应关系,但当您只有一个低级的时,这不是很明显。然后()。您所寻找的基本上是一组回调/回调聚合,但这根本不是promise的重点。

想想. cat(fn)一样,然后(null, fn)

doSomething().then(function(val) {
    console.log(val);
}).catch(function(e) {
    console.error(e);
});

与同步代码并行(想象doSomething同步返回):

try {
    var val = doSomething();
    console.log(val);
}
catch(e) {
    console.error(e);
}

多个捕获(请记住,. cat的更可读别名。

doSomething().then(function(val) {
    console.log(val);
}).catch(function(e) {
    return e;
}).catch(function(e){
    //Will not get here ever
    //because error thrown from doSomething()
    //was handled in the upper catch which doesn't trow
});

相似之处:

try {
    try {
        var val = doSomething();
        console.log(val);
    }
    catch(e) {
        //no need for explicit return e
    }
}
catch( e ) {
    //Will not get here ever
    //because error thrown from doSomething()
    //was handled in the upper catch which doesn't trow
}

所以现在你应该注意到你可以通过投掷而不是返回来创建预期的结果http://jsfiddle.net/VYSj7/3/

. cat()是IMOpromise库提供的基本方法,将来也将包含在内置Javascriptpromise中。但是,如果没有提供这样的方法,您可以(或者应该提供,不幸的是,有些实现不使用原型):

Promise.prototype.catch = function(fn) {
    return this.then(null, fn);
};

拒绝变成了满足

 类似资料:
  • 我试图让我的头周围的promise,我得到了这个错误抱怨未处理的promise拒绝,但我确实有一个<代码>捕捉如果它被拒绝! 谁能帮帮我我做错了什么? 这是我的代码: 错误: (节点:200092)未处理的PromisejectionWarning:未处理的promise拒绝。这个错误要么是由于在没有catch块的情况下抛出异步函数的内部,要么是因为拒绝了没有使用catch块处理的promise。

  • 我正在尝试调试一个远程应用程序。我已经在服务器上启动了一个SOCKS代理: ssh-D 9999主机名 然后,我尝试从eclipse调试设置连接到它,其中主机名相同,端口=9999。 但是我得到了错误: 我还更新了eclipse网络连接以允许SOCKS代理。该配置在同一网络中的不同主机名上工作。 我无法解释此错误消息。有人能帮助我哪里出错了吗?我看了看这个:SSH连接成功,但localhost端口

  • 我正在使用默认配置,同时添加在我的ubuntu 12.04计算机上安装了nginx的特定目录。 我只需要一个简单的静态nginx服务器来提供该目录之外的文件。但是,请检查我明白了 我已经在上完成了,我已经将它们设置为。我不知道还需要设置什么。

  • 我使用Java连接MySQL和Json将数据发送到android,当我通过URL地址将数据从Java发送到Json时: 一切都很好,但是当我在Android中解析数据时,我收到了一个错误结果,如下所示: logcat: (192.168.1.221)IP地址是我的PC机,如果我从192.168.1.221更改为本地主机,我仍然会收到相同的错误。

  • 我有一个网络服务调用,响应是纯文本,没有json。在下面的回调中,失败()总是被调用,即使响应成功,因为改装试图将响应解析为json。 出现以下错误: 改造。错误:com。谷歌。格森。JsonSyntaxException:com。谷歌。格森。流动格式错误的JSONException:使用JsonReader。setLenient(true)在第1行第16列路径接受格式错误的JSON$ 我怎样才能

  • 更新 结果发现我调用open和close FileOutputStream的频率太高了,这会在某个时候抛出FileNotFoundException。听起来更像是线程问题。