【问题标题】:js promise which is not closed correctly未正确关闭的 js 承诺
【发布时间】:2015-06-10 17:48:41
【问题描述】:

我有以下代码,当我在代码中输入 if 语句中 (if (that.cont) ) 我得到一个未完成的承诺链的错误,这可能是什么原因以及如何我应该避免吗?

run: function() {

    var oDef = Q.defer();
    var Obj = Q(sWUrl);
    if (that.cont) {
        Obj = that.cont.get(that.cont.transl).then(function(mSet) {
            debugger;
            if (mSet) {
                var lang = mSet.supportedLang;
                var dft = mSet.defaultLang;
                if (!dft) {
                    if (lang) {
                        dft = lang.split(",")[1];
                    } else {
                        dft = "en";
                    }
                }
                return Q(sWUrl + "&lang=" + window.encodeURIComponent(lang));
            } else {
                return Q(sWUrl);
            }
        }, function() {
            return Q(sWUrl);
        }).then(function(sUri) {
            return that.cont.se.pre.get("Pre").then(function(oPreSet) {
                return sUri + "&device=" + window.encodeURIComponent(oPreSet.dte);
            }).fail(function(error) {
                return sUri;
            });
        });
    }
    return Obj.then(function(sUri) {
        oWin.window.location.href = sUri;
        return oWin.oDef.promise;
    });
},

【问题讨论】:

  • return 位于if 之外,并且最后一个括号不会关闭此代码中的任何内容 - 中间某处有一个多余的括号。
  • @Vld - 括号在哪里,请在哪个语句之后告诉我?顺便说一句,最后一个是因为这段代码是一个大方法的一部分......
  • 我已经提交了一个带有正确格式的代码的编辑 - 它可以清楚地看到什么不属于 - 它是代码块底部的最后一个右花括号。
  • 你在哪里得到一个未完成的承诺链的错误?在控制台中?它是否指向任何特定的行?
  • 另外,附注:您的 dft 变量完全未使用。你是不是搞错了?

标签: javascript jquery promise q angular-promise


【解决方案1】:

我不知道该错误来自哪里,但有一件事是肯定的 - 无论您从 run 返回什么都不会解决,因为您永远不会解决 oDef(而且您使用的是“延迟反模式”)。

您似乎也错误地假设您必须从您的处理程序返回一个承诺(尽管您忘记在一个地方这样做),但事实并非如此。如果没有什么可等待的,您可以返回普通值。

试试这个:

run: function() {
    var p;
    if (that.cont) {
        p = that.cont.get(that.cont.transl).then(function(mSet) {
            if (mSet) {
                var lang = mSet.supportedLang;
                var dft = mSet.defaultLang;
                if (!dft) {
                    if (lang) {
                        dft = lang.split(",")[1];
                    } else {
                        dft = "en";
                    }
                }
                return sWUrl + "&lang=" + window.encodeURIComponent(lang);
            } else {
                return sWUrl;
            }
        }, function() {
            return sWUrl;
        }).then(function(sUri) {
            return that.cont.se.pre.get("Pre").then(function(oPreSet) {
                return sUri + "&device=" + window.encodeURIComponent(oPreSet.dte);
            }).fail(function(error) {
                return sUri;
            });
        });
    } else {
        p = Q(sWUrl);
    }

    return p.then(function(sUri) {
        oWin.window.location.href = sUri;
    });
},

【讨论】:

  • @JhonDree 你能回答我的问题吗?
  • 我完全删除了 if(mSet) 问题仍然存在......还有其他建议吗?
  • @JhonDree 你能回答我的其他问题吗?
  • @JhonDree 请查看您问题的 cmets 部分并阅读我的最后两个 cmets。有两个问题你没有回答,一个我不确定你是否回答了。
  • 这有点难以回答,因为这不是我的代码 :( 我需要修复这个错误......任何建议或您的经验中的一些提示我应该如何继续?提前谢谢!投票赞成你的帮助:)
猜你喜欢
  • 1970-01-01
  • 2017-10-09
  • 2014-07-07
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2017-05-18
  • 2020-01-22
  • 2014-11-23
相关资源
最近更新 更多