JQuery Deferred对象使用小结
场景描述
如下,打开页面时,获取默认选中的项目,同时也会初始化Combobox下拉框下拉列表数据
问题描述
获取默认选中项目及下拉列表的js函数位于common.js文件,类似如下:
// 根据项目类型,获取对应的项目
function getProjects(projectType) {
// 请求已有已启用项目
$.get('/action/getProjects?projectType=' + projectType, function(data,status) {
var jsonData = JSON.parse(data);
return jsonData;
});
}
js函数调用代码位于另一个html文件--testTaskManager.html,<script></script>元素标签内。
如下
// 初始化项目combobox下拉列表
var jsonData = getProjects('TestProject');
console.log(jsonData);
if (jsonData['result'] == 'success') {
$('#projects').combobox('loadData', jsonData['data']);
} else {
$.messager.alert('错误信息', '获取项目失败:' + jsonData['data'], 'error');
}
结果打开页面时,控制台提示如下:
原因很简单,
var jsonData = getProjects('TestProject');
以上代码getProjects函数调用,会引发get请求。
紧接着,开始执行后续的代码,涉及到jsonData的引用,但是此时,请求可能还没返回结果,也就是说getProjects 还没返回数据给jsonData,jsonData未定义。
解决方案
让这两个文件中的代码“同步”运行。
function getProjects(projectType) {
var defer = $.Deferred(); //返回Deferred对象;
// 请求已有已启用项目
$.get('/action/getProjects?projectType=' + projectType, function(data,status) {
var jsonData = JSON.parse(data);
defer.resolve(jsonData);
});
return defer;
}
// 初始化项目combobox下拉列表
getProjects('TestProject').then(function(jsonData) {
if (jsonData['result'] == 'success') {
$('#projects').combobox('loadData', jsonData['data']);
} else {
$.messager.alert('错误信息', '获取项目失败:' + jsonData['data'], 'error');
}
});
说明
以上代码,大致意思就是先指定getProjects函数的的异步操作,执行完成后才执行then函数中指定的回调函数。
done(fn)
fail(fn)
then(done, fail)
done, fail这两个方法都用来绑定回调函数fn,fn可能是一个function,也有可能是多个以逗号分隔的function函数。
resolve(arg)
这个方法用来改变deferred对象的状态为resolved, 并告诉deferred对象执行done回调,arg是传递给回调函数的参数。
reject(arg)
这个方法用来改变deferred对象的状态为rejected,并告诉deferred对象执行done回调,arg是传递给回调函数的参数。
JQuery Deferred对象使用小结的更多相关文章
- javascript --- jQuery --- Deferred对象
javascript --- jQuery --- Deferred对象 javascript的函数式编程是多么引人入胜,jQuery使代码尽可能的精简,intelligent! defer - 必应 ...
- JQuery Deferred 对象
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html <jQu ...
- jQuery.Deferred对象
一.前言 jQuery1.5之前,如果需要多次Ajax操作,我们一般会使用下面的两种方式: 1).串行调用Ajax $.ajax({ success: function() { $.ajax({ su ...
- JQuery Deferred 对象剖析
JQuery 中利用 Deferred 对象提供类似 ES2016(aka. es7) 中 Promise 的功能. JQuery 中的 AJAX 请求函数返回的就是 Deferred 对象. 通过使 ...
- 使用JQuery Deferred对象的then() 解决多个AJAX操作顺序依赖的问题
原文地址:http://www.2cto.com/kf/201507/424202.html 之前的文章javascript异步代码的回调地狱中提到了编写AJAX代码经常遇到的3个问题,现在我们看下如 ...
- jQuery Deferred对象详细源码分析(-)
本系列文章讲介绍这个Deferred东西到底拿来干什么,从1.5版本加进来,jQuery的很多代码都重写了.直接先上源码分析了,清楚了源码分析,下节将讲具体的应用 以及应用场景. 创建对象 var d ...
- 知识笔记:jQuery 事件对象属性小结
使用事件自然少不了事件对象.因为不同浏览器之间事件对象的获取,以及事件对象的属性都有差异,导致我们很难跨浏览器使用事件对象.jQuery中统一了事件对象,当绑定事件处理函数时,会将jQuery格式化后 ...
- jquery 事件对象属性小结
使用事件自然少不了事件对象. 因为不同浏览器之间事件对象的获取, 以及事件对象的属性都有差异, 导致我们很难跨浏览器使用事件对象. jQuery中统一了事件对象, 当绑定事件处理函数时, 会将jQue ...
- 利用 Jquery Deferred 异步你的程序
最近在做公司QA系统改造时,有这样的一个场景. QA系统中有些数据项需要从JIRA平台(一个国外项目与事务跟踪工具)中获取,JIRA平台提供了很完善的Rest API. 现在的要求是,在QA系统中提交 ...
随机推荐
- 【每天一题】LeetCode 0067. 二进制求和
开源地址:https://github.com/jiauzhang/algorithms 题目描述 * https://leetcode-cn.com/problems/add-binary * 给定 ...
- Linux服务器部署.Net Core笔记:一、开启ssh服务
开启ssh服务需要root权限,先用root账户登陆系统 在安装ssh前我们先更新一下yum:yum update 先检查有没有安装ssh服务:rpm -qa | grep ssh 如果没有安装ssh ...
- idea创建Maven版的ssm项目
要使用idea创建一个maven项目,首先电脑安装maven,maven下载地址:http://maven.apache.org/download.cgi 1.打开idea,选择创建一个新项目,选择m ...
- 【目录】Cocos2d-x系列
1.Cocos2d-x的坐标系统 2.Cocos2d-x 点击菜单按键居中放大(无需修改底层代码) 3.发布Cocos2d-x的PC端程序 4.Cocos2d-x游戏实例<忍者飞镖>之对象 ...
- RN配置 java和python环境
安装java JDK 不推荐更改安装路径. 安装时 不要有中文 会安装jdK和jre 1==>配置新建 JAVA_HOME 具体是[编辑]==>[新建] 然后添加下两句 JAVA_HOME ...
- Python语法规则
Python基本语法 Python的语法相对比C,C++,Java更加简洁,比较符合人的正常思维.本篇介绍Python的基本语法,通过本篇文章你可以学到以下内容. 掌握Python的基本语法 识别Py ...
- python接口测试中常见的两种接口依赖处理方式
一.请求体的字段依赖 这种情况多数是在当前测试的接口,它的前置接口的请求体中的字段要拿来在当前的接口请求体中继续使用,比如修改用户信息的接口,该接口会使用到用户名的字段,该字段是由创建用户时的请求体中 ...
- Java生鲜电商平台-优惠券功能设计与开发(小程序/APP)
Java生鲜电商平台-优惠券功能设计与开发(小程序/APP) 说明:Java生鲜电商平台-优惠券功能设计与开发(小程序/APP) 目录 1.项目背景与需求分析 2.需求目的与功能点列表 3.业务逻辑 ...
- Localize UI Elements 汉化界面(本地化)
In this lesson, you will learn the basics of localizing visible UI elements. By default, the applica ...
- 微服务-Springboot+Redis缓存管理接口代码实现
废话少说,上代码,结合代码讲解: 一.创建maven工程:导入依赖: <packaging>war</packaging><!--修改jdk的版本--><pr ...