Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery承诺一切_Javascript_Jquery_Asynchronous_Promise_Jquery Deferred - Fatal编程技术网

Javascript jQuery承诺一切

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

这种模式在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 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中,因为他不知道有人需要等待它,或者他是一个糟糕的程序员