2016-04-08 11 views
0

現在、私は少しフォームを検証しています。 postの助けを借りて、私はそれぞれのバリデーションを順次行いました。配列の値がfalseの場合に約束を破る

バリデーションの配列に偽の値が表示されたらすぐに約束を破る必要はなく、配列内の真偽値に関係なく完了する必要があります。どのように私は今持っているものに基づいてこのコンセプトを組み込むことができますか? MDNによると

var validations = [validatePassword, validateName, validateAddress, ...]; 

$continueButton.on('click', function() {  
    subscribe().then(function() { 
    // Do something 
    }, function() { 
    // Show error 
    }); 
}); 

function subscribe() { 
    var promises = validations.map(function(validation) { 
    return validation(); 
    }); 

    return Promise.all(promises); 
} 

function validatePassword() { 
    var password = $password.val(); 
    var format = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])[^+&\n]{8,}$/; 
    return validateInput(format.test(password), $password); 
} 

function validateAddress() { 
    return new Promise(function (resolve, reject) { 
    $.ajax({ 
     type: 'POST', 
     url: '/address/validate', 
     data: $form.serialize(), 
     dataType: 'json', 
     success: function(response) { 
     var hasValidAddres = response.Data === 200; 

     validateInput(hasValidAddres, $address); 

     hasValidAddres ? resolve() : reject(); 
     }, 
     error: function() { 
     // Show error 
     } 
    }); 
    }); 
} 

function validateInput(validation, $input) { 
    if (validation) { 
    $input.removeClass('invalid'); 
    return true; 
    } else { 
    markAsInvalid($input); 
    // Was originally return false 
    return Promise.reject('Example Error'); 
    } 
} 

function markAsInvalid($input) { 
    $input.addClass('invalid'); 
} 

答えて

0

要素の一つが拒否され、Promise.allが速く失敗した場合にPromise.allはフェイルファストの動作を

Promise.allが拒否された:あなたが持っている場合タイムアウト後に解決する4つの約束とすぐに拒否する約束はすぐに拒否する

あなたのコードはそのままのrk;検証が失敗した場合、Promise.allは放棄し、直ちにfalseを返します。あなたのバリデータのいずれかでエラーで拒否すべき

0

function validatePassword() { 
    if (invalidPassword) { 
    var err = new Error('Invalid passw'); 
    return Promise.reject(err); 
    } 
} 

エラーの場合はバリの一つには、subscribe機能にthenブロックと呼ばれるが、catch意志されることはありません。

+0

あなたが「あなたのバリデータの1つでエラーで拒否すべきです」と言うとき、私は 'validations'配列内の1つのバリデーション関数で' return Promise.reject(err); 'を書くだけですか? –

+0

プロミスチェーンを拒否するには、検証が失敗したときに、すべての検証関数にこのコードを追加し、エラーを拒否する必要があります。 – alexmac

+0

私は 'Uncaught(promise)エラー 'を表示しています –

関連する問題