2014-03-25 131 views
0

我試圖根據Backbone.js中的國家/地區代碼驗證電話號碼。我需要等到ajax回調被執行之後才返回驗證結果。我正在使用Jquerys when方法。該模型的驗證功能:Jquery .when()不等待

validate: function(attrs) { 

     this.errors = []; 


     if(attrs['phone'].length>0){ 
      //validate 

      console.log('before when '); 

      $.when(this.checkPhoneNumber(attrs)).done(function(response){ 

       console.log('resspone is '); 
       console.log(response); 

       if(response.valid!==true){ 
        that.errors.push({input_tag: 'phone', error: 'Please enter a valid phone number'}); 
       } 

       if(that.errors.length > 0){     
        return that.errors; 
       } 

      }); 

      console.log('after when '); 


     } 
     else{ 

      console.log('in the else so no phone number'); 

      if(this.errors.length > 0){ 
       return this.errors; 
      } 
     } 

    },   

而且checkPhoneNumber是:

checkPhoneNumber: function(attrs){ 

      return $.ajax({ 
       url: "http://hidden-oasis-1864.herokuapp.com/check-phone-number/"+attrs['country']+"/"+attrs['phone'], 
       success: function(response){ 

        console.log('in checkPhoneNumber success'); 

       }, 
       error: function(){ 

        that.errors.push({input_tag: 'phone', error: 'There was an error validating the phone number'}); 
        return that.errors; 
       } 
      });  

    }, 

在視圖中,我做的:

 if (!this.model.isValid()) {   
      this.processErrors(this.model.validationError); 
     } 

isValid()運行模型的validate()methos。

但在日誌中我總是得到:

before when ContactModel.js:46 

after when ContactModel.js:63 

MODEL IS VALID ContactItem.js:66 

in checkPhoneNumber success 

所以當()不候。我究竟做錯了什麼?

+0

你怎麼調用使用'$ .when'的方法? – tkone

+0

在視圖中我執行:this.model.isValid(),這會導致骨幹模型中的validate函數被執行。如果它沒有返回任何內容,那麼它是有效的,如果它返回一些東西,那麼它就是無效的...... – user1716672

回答

2

嘗試用

checkPhoneNumber: function(attrs){ 

     return $.ajax({ 
      url: "http://hidden-oasis-1864.herokuapp.com/check-phone-number/"+attrs['country']+"/"+attrs['phone'], 
      success: function(response){ 

       console.log('in checkPhoneNumber success'); 

      }, 
      error: function(){ 
       console.log("I FOUND MY PROBLEM"); 

       that.errors.push({input_tag: 'phone', error: 'There was an error validating the phone number'}); 
       return that.errors; 
      } 
     });  

}, 

它看起來像Ajax調用返回一個錯誤,所以done不會被調用。

要註冊失敗的回叫,請使用fail並註冊回叫以始終執行使用then

+0

'then'回傳通過/失敗/通知,但總是執行。 – psquared

+0

但它進入成功,因爲我看到「在checkPhoneNumber成功」 – user1716672

+0

我可以得到這個值得的唯一方法是通過在ajax請求中包含選項async:false。它的作品。但似乎沒有必要使用async:false選項與.when() – user1716672