使用jQuery Deferred实现Promise时报dfrd.resolve is not a function错如何解决
错误原因
- 最核心的触发原因是
$.Deferred()执行后返回的对象不是标准jQuery Deferred实例,导致实例上不存在resolve方法,常见触发场景如下:- $符号被其他第三方库(如Prototype、Zepto等)覆盖,未正确指向jQuery对象,或页面未正确引入1.5版本以上的jQuery
- 实际运行的代码中Deferred实例化时漏写括号,写成
var dfrd = $.Deferred,此时dfrd拿到的是Deferred构造函数本身而非实例
- 后续尝试的两种修改写法本身存在逻辑错误:
hits => dfrd.resolve(hits)仅定义了箭头函数,并未实际执行resolve调用dfrd.resolve=hits直接将resolve方法覆盖为普通变量值,自然会触发「不是函数」的报错,两种写法均需要回滚
修复方案
- 先确认jQuery加载状态:在
var dfrd = $.Deferred();后插入console.log(typeof dfrd.resolve),如果输出不为function则说明Deferred实例生成异常 - 避免$符号冲突的修复写法:
function retrievecount(id, type) { // 使用jQuery全称替代$符号,规避命名冲突 var dfrd = jQuery.Deferred(); var hits = "the result"; dfrd.resolve(hits); return dfrd.promise(); } // 调用代码不变 retrievecount(id, type) .then(function(hits) { // 正常处理hits逻辑 });
- 无jQuery依赖的原生Promise实现方案:
function retrievecount(id, type) { return new Promise((resolve) => { var hits = "the result"; resolve(hits); }); } // 调用代码完全兼容原有写法 retrievecount(id, type) .then(function(hits) { // 正常处理hits逻辑 });
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

