js promise没有正确关闭

js promise which is not closed correctly

本文关键字:promise js      更新时间:2023-09-26

我有以下代码,在代码中,当我在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返回什么,都永远不会解决,因为你永远不会解决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;
    });
},