field-form icon indicating copy to clipboard operation
field-form copied to clipboard

官方用法, onFinish永远不会被调用

Open fallenleavesguy opened this issue 4 years ago • 3 comments

demo地址https://field-form.react-component.vercel.app/demo/validate

导致bug代码段

context => ({
  validator(_, __, callback) {
    if (context.isFieldTouched('password2')) {
      context.validateFields(['password2']);
      callback();
      return;
    }
    callback();
  },
}),

fallenleavesguy avatar Feb 26 '21 13:02 fallenleavesguy

onFinishFailed会被调用

fallenleavesguy avatar Feb 26 '21 14:02 fallenleavesguy

@fallenleavesguy 前些天遇到了类似问题,原因是 node_modules/rc-field-form/es/useForm.js中

783     var summaryPromise = allPromiseFinish(promiseList);
784     _this.lastValidatePromise = summaryPromise; // Notify fields with rule that validate has finished and need update
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^调用validateFields这里会被覆盖,导致下文出现outOfDate: true的异常。
785
786     summaryPromise.catch(function (results) {
787       return results;
788     }).then(function (results) {
789       var resultNamePathList = results.map(function (_ref6) {
790         var name = _ref6.name;
791         return name;
792       });
793
794       _this.notifyObservers(_this.store, resultNamePathList, {
795         type: 'validateFinish'
796       });
797
798       _this.triggerOnFieldsChange(resultNamePathList, results);
799     });
800     var returnPromise = summaryPromise.then(function () {
801       if (_this.lastValidatePromise === summaryPromise) {
802         return Promise.resolve(_this.getFieldsValue(namePathList));
803       }
804
805       return Promise.reject([]);
806     }).catch(function (results) {
807       var errorList = results.filter(function (result) {
808         return result && result.errors.length;
809       });
810       return Promise.reject({
811         values: _this.getFieldsValue(namePathList),
812         errorFields: errorList,
813         outOfDate: _this.lastValidatePromise !== summaryPromise
814       });
815     }); // Do not throw in console

建议使用 setTimeout(()=>context.validateFields(['password2'])); 来避免同时交叉进行两个Promise。

rains31 avatar Feb 10 '22 07:02 rains31