未捕获(承诺)TypeError:$(...)。ready(...)。那么不是函数

时间:2018-05-30 19:18:04

标签: javascript jquery

<script>
    function solution() {
        let pro = new Promise((res, rej) => {
            let arr = [];
            $(document).ready(function () {
                arr.push(1);
                res(arr);
            }).then((response) => {
                console.log(response);
            });
        });
    }
    solution();
</script>

为什么在promise中包装$(document).ready()会生成Uncaught(在promise中)TypeError:$(...)。ready(...)。那么是不是函数错误?我确信$(document).ready()可以独立工作。

2 个答案:

答案 0 :(得分:0)

请参阅jQuery中的$(document).ready(...)以及任何其他事件处理程序附件函数returns a jQuery object - 这不是Promise(并且没有{\ n} {分配了{1}}方法)。你真正需要的是转移parens:

&#13;
&#13;
then
&#13;
function solution() {
  let pro = new Promise((res, rej) => {
    let arr = [];
    $(document).ready(function() {
      arr.push(1);
      res(arr);
    });
  }).then(response => console.log(response));
}
solution();
&#13;
&#13;
&#13;

...以便在您的新Promise上调用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>(在jQuery代码将DOM视为.then()后解析)。

但不清楚,为什么需要在附加处理程序的同一函数中直接使用ready。让这个函数只做一个事情可能是一个更好的主意 - 只要文档准备好就返回一个Promise。在这种情况下,您可以为其附加多个处理程序:

then

...然后用它来附加几个处理程序:

function whenDomIsReady() {
  const someInitialData = ['Spanish Inquisition']; // nobody expects!
  return new Promise(res => {
    $(document).ready(function() {
      res(someInitialData);
    });
  });
}

实际上(感谢@KevinB提到它),这个问题已经解决了 - 在jQuery本身,$.ready,自1.8以来可用:

whenDomIsReady().then(console.log);

答案 1 :(得分:-1)

&#13;
&#13;
<script>
    function solution() {
        let pro = new Promise((res, rej) => {
            let arr = [];
            $(document).ready(function () {
                arr.push(1);
                res(arr);
            })
        })
        .then((response) => console.log(response));
    }
    solution();
</script>
&#13;
&#13;
&#13;

你当时在错误的地方。它在承诺中被召唤。它应该紧随其后。