向Promise.resolve添加实现

时间:2017-01-11 11:17:09

标签: javascript promise es6-promise

我想通过使用isValid方法而不是then方法创建一个小脚本来检查模型是否有效。

以下是使用then方法的脚本:



$('button').click(function () {
  let model = Promise.resolve({
    then(x, y) {
      let isValid = $('input[type=text]').val().length > 0;
      x(isValid);
    }
  });
  
  model.then(isValid => console.log(isValid));
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" />
<button>check</button>
&#13;
&#13;
&#13;

我的目标:

if (model.isValid()) {
    console.log('model is valid.');
}

我试过了:

&#13;
&#13;
$('button').click(function () {
  let model = Promise.resolve({
    isValid() {
      let isValid = $('input[type=text]').val().length > 0;
      return isValid;
    }
  });
  
  if (model.isValid()) {
    console.log('model is valid.');
  }
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" />
<button>check</button>
&#13;
&#13;
&#13;

错误讯息:

  

未捕获的TypeError:&#39; model.isValid&#39;不是一个功能

我的问题:在这种情况下如何定义isValid函数?

2 个答案:

答案 0 :(得分:1)

第二个实现得到了运行时错误,因为Promise.resolve返回:

  

一个Promise对象   用给定的值解决。如果该值是可以的(即具有a   “然后”方法),返回的承诺将“跟随”那个,   采用其最终状态;否则返回的承诺将是   实现了价值。

所以,如果你定义这样的承诺:

 Promise.resolve({
    isValid() {
      let isValid = $('input[type=text]').val().length > 0;
      return isValid;
    }
  }); 

您要返回 thenable 的对象(它没有then方法,只有isValid方法,所以你不能简单地做model.isValid(),但你必须:

$('button').click(function () {
  let model = Promise.resolve({
    isValid() {
      let isValid = $('input[type=text]').val().length > 0;
      return isValid;
    }
  });
  
  model.then(res => {
      if (res.isValid()) {
        console.log('model is valid.');
      }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" />
<button>check</button>

答案 1 :(得分:0)

那么,你为什么需要使用Promise?对于你的例子,它更简单

$('button').click(function () {
  let isValid = $('input[type=text]').val().length > 0;
  if (isValid) {
     console.log('model is valid.');
  }
});