2015-04-06 102 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