2016-08-04 1 views
0

私はAngularJsの新機能です。 私は約束を返す1つのバリデート関数を持っています。この関数は内部的にhttp get apiを呼び出し、約束応答を受け取ります。私は、呼び出されたAPIからの応答を必要とするいくつかの検証コードを持っています。しかし、http呼び出しが完了し、関数がAPIから応答を受け取る前に、validate関数は呼び出し元に約束を返しました。検証に失敗しました。誰かがこの要件を満たすいくつかのコードを共有してください。http APIが完了する前に角度関数が約束を返しました

function validateDates(delegate) {  
    var currStartDate = delegate.start_date; 
    var currEndDate = delegate.end_date; 
    var overlap = false; 
    var deferred = $q.defer(); 

    UserDelegateService.getDelegateForUser(delegate.comit_id).then(
     function(res) { 
      for(var i = 0; i<res.length; i++) { 
        var sDate = $filter('date')(res[i].start_date, 'yyyy-MM-dd'); 
        var eDate = $filter('date')(res[i].end_date, 'yyyy-MM-dd'); 
        if(currStartDate <= eDate && sDate <= currEndDate) { 
         overlap = true;   
         deferred.resolve(overlap);       
        } else 
         deferred.reject("Not overlapping"); 
       } 
     }, 
     function(errorresponse) { 
      console.log(errorresponse); 
     }); 
    return deferred.promise; 
}; 

呼び出すコード:

$scope.saveDelegate = function() { 
    var delegate = { 
      //assign values ... 
    }; 

    var promise = validateDates(delegate); 
    promise.then(function(data) { 
     if(data) { 
      console.log('Dates are overlapping....if part.......', data); 
     } 
    }, function(reason) { 
      console.log('Dates are not overlapping..saving datlegate..else part.........', reason); 
      $scope.save(delegate); 
    }); 
}; 
+1

あなたは今までに何をしてもらえますか? –

+0

投稿を更新しました。ありがとう! – javauser

+0

この状況を正しく処理するには、 '.then'関数を呼び出しコードに移動するか、別の' .then'関数の背後に連鎖させることです。これがどのように機能するかの提案については、呼び出しコードを表示してください。 – Claies

答えて

0

$q.defer休憩約束チェーンを使用してエラー情報を失います。ループのforループの最初の項目についても解決/拒否の決定が行われました。

代わりに返信値およびチェーンです。

function validateDates(delegate) {  
    var currStartDate = delegate.start_date; 
    var currEndDate = delegate.end_date; 
    //var overlap = false; 
    //var deferred = $q.defer(); 

    var p = UserDelegateService.getDelegateForUser(delegate.comit_id); 
    var derivedPromise = p.then(
     function onSuccess(res) { 
      //Initialize overlap var in success handler 
      var overlap = false; 
      for(var i = 0; i<res.length; i++) { 
       var sDate = $filter('date')(res[i].start_date, 'yyyy-MM-dd'); 
       var eDate = $filter('date')(res[i].end_date, 'yyyy-MM-dd'); 
       if(currStartDate <= eDate && sDate <= currEndDate) { 
        overlap = true;   
       }; 
      //Return value of overlap for chaining 
      return overlap; 
     }); 
    }; 
    //return derived promise 
    return derivedPromise; 
}; 

上記の関数は、日付のいずれも重複していない場合は、日付のいずれかが重なった場合trueを解決し、falseを解決する約束を返します。

クライアントコード:約束を連鎖とを返すことで

$scope.saveDelegate = function() { 
    var delegate = { 
      //assign values ... 
    }; 

    var promise = validateDates(delegate); 
    promise.then(function onSuccess(overlap) { 
     if(overlap) { 
      console.log('Dates are overlapping....if part.......', overlap); 
     } else { 
      console.log('Dates are not overlapping..saving datlegate..'); 
      $scope.save(delegate); 
     }; 
    }).catch(function onReject(reason) { 
     console.log("Promise rejected for another reason"); 
    }); 
}; 

getDelegateForUser操作のいずれかのエラーがクライアントコードに転送されます。

関連する問題