Javascript jQuery承诺一切
这种模式在jQuery或javascript中可能吗Javascript jQuery承诺一切,javascript,jquery,asynchronous,promise,jquery-deferred,Javascript,Jquery,Asynchronous,Promise,Jquery Deferred,这种模式在jQuery或javascript中可能吗 $.when(function(){ //I init many plugins here, some of them use ajax etc but I dont really control it //I only do something like $(div).somePlugin() here $("div").myPlugin() }).done(function(){ //and this
$.when(function(){
//I init many plugins here, some of them use ajax etc but I dont really control it
//I only do something like $(div).somePlugin() here
$("div").myPlugin()
}).done(function(){
//and this part I want to be executed when all ajaxes and deferred stuff from when part is done
//however I cannot go to every plugin and add something like deferred.resolve() etc.
});
例如,myPlugin就有
$.fn.myPlugin = function(){
$(this).load(someUrl);
};
(但我无法更改myPlugin,因为它有一些外部代码。)
基本上,我有很多事情要做,其中很多都使用了
async
。功能。当所有这些async
时,我想执行一些函数。东西都完成了,但我不能更改插件代码,所以我不能向它添加.resolve()
东西。是的,这基本上就是所做的。
什么时候做的
// changes body html
var fisrtApi = $.get("http://something/foo").then(function(r){ $("body div").html(r); });
// inits some API for usage
var secondApi = somePromiseReturningFucntion();
// sets a plugin on top of a page
var somePlugin = someOtherPromiseReturningFn();
$.when(firstApi,secondApi,somePlugin).done(function(r1, r2, r3){
// all of them ready, results are the arguments
});
它还可以将常规的非承诺返回API转换为承诺
例如,让我们执行$(document).ready(function(){
这样你就可以:
$.when($.get("http://yourAPI"), whenDocumentReady()).done(function(apiResult,_){
// access API here, the document is also ready.
});
$.when(getTweets("someusername"),whenDocumentReady()).done(function(tweets){
// document is ready here _and_ the twitter data is available,
// you can access it in the `tweets` parameter
});
例如,使用jQuery twitter,库提供了一个回调,用于在获取数据时进行回调。您可以向它承诺:
function getTweets(username, limit){
var d = $.Deferred();
$.twitter(username, limit , function(res){ d.resolve(res); });
return d.promise();
}
这样你就可以:
$.when($.get("http://yourAPI"), whenDocumentReady()).done(function(apiResult,_){
// access API here, the document is also ready.
});
$.when(getTweets("someusername"),whenDocumentReady()).done(function(tweets){
// document is ready here _and_ the twitter data is available,
// you can access it in the `tweets` parameter
});
是的,这基本上就是
所做的。
所做的
// changes body html
var fisrtApi = $.get("http://something/foo").then(function(r){ $("body div").html(r); });
// inits some API for usage
var secondApi = somePromiseReturningFucntion();
// sets a plugin on top of a page
var somePlugin = someOtherPromiseReturningFn();
$.when(firstApi,secondApi,somePlugin).done(function(r1, r2, r3){
// all of them ready, results are the arguments
});
它还可以将常规的非承诺返回API转换为承诺
例如,让我们执行$(document).ready(function(){
这样你就可以:
$.when($.get("http://yourAPI"), whenDocumentReady()).done(function(apiResult,_){
// access API here, the document is also ready.
});
$.when(getTweets("someusername"),whenDocumentReady()).done(function(tweets){
// document is ready here _and_ the twitter data is available,
// you can access it in the `tweets` parameter
});
例如,使用jQuery twitter,库提供了一个回调,用于在获取数据时进行回调。您可以向它承诺:
function getTweets(username, limit){
var d = $.Deferred();
$.twitter(username, limit , function(res){ d.resolve(res); });
return d.promise();
}
这样你就可以:
$.when($.get("http://yourAPI"), whenDocumentReady()).done(function(apiResult,_){
// access API here, the document is also ready.
});
$.when(getTweets("someusername"),whenDocumentReady()).done(function(tweets){
// document is ready here _and_ the twitter data is available,
// you can access it in the `tweets` parameter
});
如果这就是你想要的,那么是的,这是完全可能的
$.when(sync(), async(), ajax()).done(function(s,a1, a2) {
console.log( s + ' + ' + a1 + ' + ' + a2) // outputs sync + async + ajax
})
function sync() {
return 'sync'
}
function async() {
var d = $.Deferred();
setTimeout(function() {
d.resolve('async')
}, 100)
return d;
}
function ajax() {
return $.post('http://jsfiddle.net/echo/html/', { html: 'ajax' })
}
如果这就是你想要的,那么是的,这是完全可能的
$.when(sync(), async(), ajax()).done(function(s,a1, a2) {
console.log( s + ' + ' + a1 + ' + ' + a2) // outputs sync + async + ajax
})
function sync() {
return 'sync'
}
function async() {
var d = $.Deferred();
setTimeout(function() {
d.resolve('async')
}, 100)
return d;
}
function ajax() {
return $.post('http://jsfiddle.net/echo/html/', { html: 'ajax' })
}
我想唯一的办法就是有点难看 如果您不能使用deferreds和resolve方法,那么您别无选择,只能侦听dom或上下文中的更改(插件通常修改dom或在上下文中创建新对象) 然后,您必须查找
$(myElt).hasClass(“”)
从false变为true,或者类似的内容
您必须为每个插件创建一个延迟测试,并在setInterval中包装上一个测试以模拟侦听器,最后解决延迟测试
这样,你就可以把你所有的延迟都放在一个时间里,并且在继续之前确保它们都被解决了
但这真的很糟糕,因为你必须为每个插件进行个性化测试。
我想,这肯定也会减慢浏览器的速度。我想唯一的办法就是让它看起来有点难看 如果您不能使用deferreds和resolve方法,那么您别无选择,只能侦听dom或上下文中的更改(插件通常修改dom或在上下文中创建新对象) 然后,您必须查找
$(myElt).hasClass(“”)
从false变为true,或者类似的内容
您必须为每个插件创建一个延迟测试,并在setInterval中包装上一个测试以模拟侦听器,最后解决延迟测试
这样,你就可以把你所有的延迟都放在一个时间里,并且在继续之前确保它们都被解决了
但这真的很糟糕,因为你必须为每个插件进行个性化测试。
我想,这肯定也会减慢浏览器的速度。这取决于-如果它们只是常规方法,我看不出有任何意义。正如我所写的许多方法都是异步方法。比如-你能举个例子吗?添加了一些Plugindown投票者的例子,请记住这是一个完全合理的问题,也是人们面临的一个非常常见的问题g、 这取决于-如果它们只是常规方法,我看不出有什么意义。许多都是我写过的异步方法。比如-你能发布一个例子吗?添加了一些Plugindown投票者的例子,请记住这是一个完全合法的问题,也是人们面临的一个非常常见的问题。重点是你可以在这里访问你的异步对象s、 当你使用像ajax这样的外部插件时,你对这个对象没有这样的访问权限,通常它甚至没有附加到任何变量。@Kluska000只要这些插件返回jQuery承诺来标记它们完成了,或者它们有一个回调方法,你就可以将自己转换为承诺-你仍然可以这样做。注意调用
$。when
同步值也可以很好地工作,并且可以立即解决。正如我所说的,我有一个插件不会返回任何东西(就像大多数使用ajax的插件一样)。您是否能够多次使用(而不是修改)我的“插件”并等待它们的“隐藏”。加载“会完成吗?@Kluska000如果它不告诉你什么时候完成,那么你就不知道什么时候完成。大多数插件确实包含一些指示,但如果没有,你就无法修改插件或在jQuery的AJAX上设置全局钩子(顺便说一句,他们可能会使用,也可能不会使用).好的,现在我肯定你明白我的问题了。所以你不可能这么说。关键是你可以在这里访问你的异步对象。当你使用像ajax这样的外部插件时,你对这个对象没有这样的访问权限,通常它甚至没有附加到任何变量。@Kluska000,只要这些插件返回jQuery承诺标记它们完成了,或者他们有一个回调方法,您可以将自己转换为承诺-您仍然可以这样做。请注意,调用$。当对同步值调用时,也可以很好地工作,并且可以立即解决。正如我在上面所写的,我有一个插件不会返回任何内容(与大多数使用ajax的插件一样)。您能够使用吗(不修改)多次询问我的“插件”,并等待他们的“隐藏”。加载“将完成?”@Kluska000如果它没有告诉你何时完成,那么你就无法知道何时完成。大多数插件确实包含一些指示,但如果没有,你就无法修改插件或在jQuery的AJAX上设置全局挂钩(顺便说一句,他们可能正在使用,也可能没有使用)。好吧,现在我相信你明白我的问题了。所以你说不可能。如果某个John Knee让你“异步”呢插件函数忘记了返回d或解析任何内容,因为他只希望json url中的内容跳转到他喜爱的div中,因为他不知道有人需要等待它,或者他是一个糟糕的程序员