当第三方javascript异步函数完成执行时,调用自定义函数
Call a custom function when a third party javascript async function completes its execution
我有一个场景,我希望在特定的第三方js函数完成执行后执行我的函数。
我不能编辑loadOne
的源,但我可以添加/覆盖我的newLoadOne
作为点击侦听器。因此,我可以代表它执行loadOne
,并使用它返回的数据执行我的代码。
现在,我的newLoadOne
在loadOne
方法的异步回调返回之前打印console.log。
HTML
<select id="option1">
<option>1</option>
<option>2</option>
<option>3</option>
</select>
<select id="option2">
<option>One</option>
<option>Two</option>
<option>Three</option>
</select>
<input id="submit" type="button" value="Submit" />
JavaScript
function loadOne(){
someAsyncXhrMethod(with_its_own_parameters);//its own xhr method with aync callbacks
}
function newLoadOne(){
(function(){loadOne(); console.log('done');}());
}
function optionschanged(){
console.log('options changed');
}
function bEvents(){
$('#option1').change(optionschanged);
$('#option2').change(optionschanged);
$('#submit').bind('click', newLoadOne); //this is where i replace the call to loadOne with my newLoadOne
}
$(document).ready(function () {
console.log('ready');
bEvents();
});
这里是jsFiddle链接-注意:源代码中的$.ajax调用是为了解释loadOne
有一些异步回调的方法。所以$(document).ajaxComplete
不是答案。
您别无选择,只能轮询以查看异步方法是否已完成。据推测,它会以适当的频率改变一个对您可见的状态,您可以对其进行轮询(我们将该例程称为check_some_async_xhr_method_completed
)。
function newLoadOne () {
loadOne ();
check_completion (function (completed) {
console.log (completed ? 'done' : 'never finished');
});
}
function check_completion (callback) {
var number_of_tries = 20;
var timer = setInterval (
function () {
if (check_some_async_xhr_method_completed ()) {
clearInterval (timer);
callback (true);
} else if (!number_of_tries--) {
clearInterval (timer);
callback (false);
}
},
500
);
}
或者,如果你更喜欢使用承诺:
function newLoadOne () {
loadOne ();
check_completion ().then (
function () {console.log ('done'),
function () {console.log ('never finished')
);
}
function check_completion () {
var promise = Promise.new();
var number_of_tries = 20;
var timer = setInterval (
function () {
if (check_some_async_xhr_method_completed ()) {
clearInterval (timer);
p.fulfill ();
} else if(!number_of_tries--) {
clearInterval (timer);
p.reject ();
}
},
500
);
return promise;
}
或者,when
库已经有一个处理轮询的例程。
在我看来这会起作用。。。
$(document).ajaxComplete(function (event, xhr, settings) {
if ( settings.url === "the/url/that/loadone/uses" ) {
// do your callback here
}
});
对不起,只有当使用jQuery发出请求时,这才有效
相关文章:
- 通过ajax从客户端调用C#方法来执行C#方法
- ajax调用获胜't同步执行
- 控制台.log触发,但随后的 Jquery 调用不执行任何操作
- 我应该总是将模块调用到var中,还是在节点中立即执行
- Ajax调用完成后如何执行函数
- 如何生成一个执行AJAX调用的函数
- Javascript渲染.如何编写Javascript;t在函数调用结束之前继续执行代码
- 对php文件的Ajax调用返回该文件中的JS代码,而不是执行它
- AJAX 调用在获得响应并成功执行时会冻结浏览器一段时间
- 角度 2:使用一个 http 调用的结果来执行另一个调用
- 如何在调用去抖函数之后和执行之前取消该函数
- 在非 ajax 调用中的客户端执行 JavaScript
- ReactJS:在带有 ajax 调用的 .map() 语句完成后执行代码
- 如何在 JS 中调用 2 次或更多次时延迟函数执行
- 使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合
- Javascript Promise().然后防止在执行第一个调用之前重新调用该函数
- 在ajax.load调用后执行javascript时出现问题
- Javascript BlackJack 脚本不执行/调用 “hitMe()” 和 “stand()” 函数与 Mozi
- jquery:阻止某些子元素执行调用的事件
- Rails ajax 第一次执行调用