2015-04-06 89 views
0

我有以下代码并在代码中输入时if语句内(if (that.cont))我收到未完成承诺链的错误,原因可能是什么以及原因如何我应该避免它吗?js承诺没有正确关闭

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

的''的和if'的最后托架在此代码不会关闭任何外界return'谎言 - 有超过支架中间的某个位置。 – vlaz 2015-04-06 10:31:48

+0

@Vld - 你可以在哪些语句之后向我展示支架在哪里?顺便说一句,最后一个是因为这个代码是一个大方法的一部分... – 2015-04-06 10:34:02

+0

我已经提交了一个编码格式正确的代码 - 它清楚地看到什么不属于 - 这是最后一个关闭花括号代码块的底部。 – vlaz 2015-04-06 10:36:41

回答

4

我不知道该错误会来自何处,但有一两件事是肯定的 - 无论你从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; 
    }); 
}, 
+0

谢谢,但我尝试了,我得到了同样的错误... :( – 2015-04-06 11:09:34

+0

@JhonDree你能回答我的问题吗? – JLRishe 2015-04-06 11:11:40

+0

我完全删除了if(mSet)并且问题仍然存在...其他建议? – 2015-04-06 11:14:41