我一直在阅读jQuery延迟和承诺,我看不出使用.then()&.done()成功回调之间的区别.我知道Eric Hynds提到.done()并.success()映射到相同的功能,但我猜是这样做的,.then()因为所有的回调都是在成功操作完成时调用的.
任何人都可以请你告诉我正确的用法?
这是一个人为的例子:http://jsfiddle.net/adamjford/YNGcm/20/
HTML:
<a href="#">Click me!</a>
<div></div>
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
function getSomeDeferredStuff() {
var deferreds = [];
var i = 1;
for (i = 1; i <= 10; i++) {
var count = i;
deferreds.push(
$.post('/echo/html/', {
html: "<p>Task #" + count + " complete.",
delay: count
}).success(function(data) {
$("div").append(data);
}));
}
return deferreds;
}
$(function() {
$("a").click(function() {
var deferreds = getSomeDeferredStuff();
$.when(deferreds).done(function() {
$("div").append("<p>All done!</p>");
});
});
});
Run Code Online (Sandbox Code Playgroud)
我想要"全部完成!" 在所有延迟任务完成后$.when()出现,但似乎不知道如何处理Deferred对象数组."全部完成!" 首先发生的是因为数组不是Deferred对象,所以jQuery继续并假设它刚刚完成.
我知道可以将对象传递给函数,$.when(deferred1, deferred2, ..., deferredX) …
jQuery 1.5带来了新的Deferred对象和附加的方法.when,.Deferred以及._Deferred.
对于那些谁没有带使用.Deferred之前,我已经注释的源它
这些新方法有哪些可能的用法,我们如何将它们融入模式?
我已经阅读了API和源代码,所以我知道它的作用.我的问题是我们如何在日常代码中使用这些新功能?
我有一个缓冲类的简单示例,它按顺序调用AJAX请求.(下一个在上一个完成后开始).
/* Class: Buffer
* methods: append
*
* Constructor: takes a function which will be the task handler to be called
*
* .append appends a task to the buffer. Buffer will only call a task when the
* previous task has finished
*/
var Buffer = function(handler) {
var tasks = [];
// empty resolved deferred object
var …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序需要按特定顺序加载数据:根URL,然后是模式,然后最终使用各种数据对象的模式和URL初始化应用程序.当用户导航应用程序时,将加载数据对象,根据模式进行验证并显示.当用户CRUD数据时,模式提供首次通过验证.
我在初始化时遇到问题.我使用Ajax调用来获取根对象$ .when(),然后创建一个promises数组,每个模式对象一个.这样可行.我在控制台中看到了fetch.
然后我看到所有模式的获取,因此每个$ .ajax()调用都有效.fetchschemas()确实返回了一个promises数组.
但是,最终when()子句永远不会触发,并且"DONE"字样永远不会出现在控制台上.jquery-1.5的源代码似乎暗示"null"可以作为传递给$ .when.apply()的对象,因为when()将构建一个内部Deferred()对象来管理列表,如果没有对象是传入
这使用Futures.js.如果不是这样的话,应如何管理jQuery Deferreds数组呢?
var fetch_schemas, fetch_root;
fetch_schemas = function(schema_urls) {
var fetch_one = function(url) {
return $.ajax({
url: url,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
return $.map(schema_urls, fetch_one);
};
fetch_root = function() {
return $.ajax({
url: BASE_URL,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
$.when(fetch_root()).then(function(data) {
var promises = fetch_schemas(data.schema_urls);
$.when.apply(null, promises).then(function(schemas) {
console.log("DONE", this, schemas);
});
});
Run Code Online (Sandbox Code Playgroud) jQuery 1.5添加了"Deferred Objects".他们是什么,他们究竟做了什么?
谁能帮我?
我无法理解之间的区别success和.done()的$.ajax.
如果可能请举例.
jQuery Deferred有两个函数可用于实现函数的异步链接:
then()
deferred.then( doneCallbacks, failCallbacks ) Returns: DeferreddoneCallbacks解析Deferred时调用的函数或函数数组.
failCallbacks拒绝延迟时调用的函数或函数数组.
pipe()
deferred.pipe( [doneFilter] [, failFilter] ) Returns: PromisedoneFilter解析Deferred时调用的可选函数.
failFilter拒绝Deferred时调用的可选函数.
我知道then()已经存在了一段时间,pipe()因此后者必须增加一些额外的好处,但正是这种差异恰恰在于我.两者都采用了几乎相同的回调参数,尽管它们的名称不同,返回a Deferred和返回a 之间的区别Promise似乎很小.
我已经一遍又一遍地阅读官方文档,但总是发现它们太"密集"而无法真正地包围我的搜索已经找到了很多关于这个或另一个特征的讨论,但我没有发现任何真正澄清不同的东西每个人的利弊.
那么什么时候使用then它更好,pipe什么时候使用更好?
Felix的出色答案确实有助于阐明这两个功能的区别.但我想知道是否有时候功能性then()比那更好pipe().
很明显,它pipe()比then()以前更强大,似乎前者可以做后者可以做的任何事情.使用的一个原因then()可能是它的名称反映了它作为处理相同数据的一系列函数的终止的作用.
但是有一个用例需要then()返回由于它返回一个新的而Deferred无法完成的原始文件吗?pipe()Promise
jquery asynchronous decoupling jquery-chaining jquery-deferred
我想在完成ajax请求后渲染我的组件.
您可以在下面看到我的代码
var CategoriesSetup = React.createClass({
render: function(){
var rows = [];
$.get('http://foobar.io/api/v1/listings/categories/').done(function (data) {
$.each(data, function(index, element){
rows.push(<OptionRow obj={element} />);
});
return (<Input type='select'>{rows}</Input>)
})
}
});
Run Code Online (Sandbox Code Playgroud)
但我得到下面的错误,因为我在我的ajax请求的done方法内返回渲染.
Uncaught Error: Invariant Violation: CategoriesSetup.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.
有没有办法在开始渲染之前等待我的ajax请求结束?
除了jQuery版本之外,Deferred和Promise有什么区别?
我应该用什么来满足我的需求?我只想打电话给fooExecute().例如,我只需要fooStart()和fooEnd()切换html div状态.
//I'm using jQuery v2.0.0
function fooStart() { /* Start Notification */ }
function fooEnd() { /* End Notification */ }
function fooExecute() { /* Execute the scripts */ }
$('#button1').on('click', function() {
var deferred1 = $.Deferred();
var promise1 = $.Promise();
deferred1.???
promise1.???
});
Run Code Online (Sandbox Code Playgroud) 我真的不明白是什么delegate和promise有.
根据文件 -
delegate 将选择器和事件绑定到某种包装容器,以后可以在以后再次使用当前和未来的项目.promise()如果所有新加载的匹配,它会重新映射到第一个有限的东西.也许我真的不明白这种承诺方法.如果包装器仍然存在,但包装容器中的内容已更改,和/或通过Ajax?重新加载怎么办?为什么事件不会像第一次绑定那样触发或工作?
是的,我去过文档页面,我完全不理解他们的解释.
jquery-deferred ×10
jquery ×9
javascript ×3
.when ×2
ajax ×2
asynchronous ×2
promise ×2
decoupling ×1
reactjs ×1