未正确关闭的 js promise

js promise which is not closed correctly

我有以下代码,当我在 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;
    });
},

我不知道那个错误是从哪里来的,但有一件事是肯定的 - 无论你从 run return 永远不会解决,因为你永远不会解决 oDef(并且您正在使用 "deferred antipattern")。

你似乎也错误地假设你到return你的处理者的承诺(尽管你忘记在一个地方这样做) , 但是这是错误的。如果没有什么可等待的,您可以 return 普通值。

试一试:

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;
    });
},