我有一个紧密耦合的javascript,其中有一系列if-else检查和多个ajax调用。 ajax调用是嵌套类型。我的问题是我在一个深度嵌套的ajax可调用函数中,我想优雅地从那里出来。
代码的片段是。
function showSubscriptionLightBox() {
$.get("/ajax/get_subscription_lightbox_content.php?feed_id=" + feedid, function(data) {
//Work on the data we receive... and check whether user is logged in.
if(userLoggedIn) {
//Make one more ajax call
$.get("/ajax/is_user_subscribed.php?feed_id=" + feedid, function(data) {
//Work on data again.... and check if user is subscribed.
if(userSubscribed) {
//Then there is popup which comes up, a part of same page and it has a button name "task".
document.getElementById('task').onclick = function() {
if(document.getElementById('email_mode').checked) {
$.ajax({
url : "ajax/is_user_email_verified.php?user_id="+userID,
success : function(data) {
if(!data)
return;
var response;
response = eval("response = " + data);
if(!response)
return;
if(response['email_status'] == 0) {
//Exit from here
}}}
...... 代码的其他部分..
我想从javascript中优雅地退出,当响应['email_status'] == 0
请告诉我,怎么做?
我尝试了return语句,但它把我带到了封闭的函数,而不是在脚本之外。
谢谢,
阿米特
答案 0 :(得分:0)
有一个有趣的技巧,你总是可以在JavaScript中使用它来逃避调用堆栈: setTimeout()。它在许多情况下都很有用,不仅如此,它还经常用于解决浏览器中与DOM事件相关的错误。
$.ajax(
{
url: 'lol.php',
success: function(data)
{
setTimeOut(function()
{
// Your code comes here
}, 0); // 0 will ensure that it gets executed immediately
}
});
答案 1 :(得分:0)
我知道使用Prototype你可以用try / catch块来做到这一点。您可以从其中一个内部函数中抛出一个对象,它将向上移动调用堆栈,以便其他函数进行拦截。
答案 2 :(得分:0)
对于它的价值,这里是我的一个应用程序的一些代码。它使用JSONP和AJAX同步记录。它首先从远程服务器获取一个对象ID数组。然后,它从主机服务器获取零索引处的对象id的记录。然后它将收到的记录发送到远程服务器。此时,它通过以递增的索引启动进程来继续该过程。它在索引到达数组末尾时终止。
(function( $ ) {
$.getJSON( 'http://remote.com/admin/record_ids.js?callback=?', function( data ) {
var set_record = function( index ) {
if ( index < data.length ) {
$.get( 'record_get.json', { contact_id: data[ index ] }, function( data ) {
$.getJSON( 'http://remote.com/admin/record_save.js?callback=?', data, function() {
set_record( index + 1 );
});
}, 'json');
}
};
set_record( 0 );
});
})( jQuery );
正如你所看到的,当你想要优雅地出去时,你就是不要打电话。我无法想象为什么你不能只是回来停止你的代码。