2012-12-19 114 views
1

我不知道我怎样才能让我的剧本等待AJAX​​来完成:AJAX线程 - 如何等待它完成?

function urlExists(testUrl){ 
    var ajaxurl = 'some AJAX URL'; 
    jQuery.ajax({ 
     type: "POST", 
     url: ajaxurl, 
     data: { 
       "action": "somefunction", 
       "content": testUrl 
      }, 
     global: false, 
     success: function(){ 
      alert('ajax successs'); 
      return true; 
     }, 
     error: function(){ 
      return false; 
     } 
    }); 
    return false; 
} 

/* The AJAX function returns TRUE or FALSE 100% alright. */ 
/* The interesting part begins below. */ 

if(urlExists(src)){ 
    alert('test'); 
}else{ 
    alert('test2'); 
} 

当AJAX返回TRUE(或FALSE)的if(urlExists(src))总是说test2 ...我敢打赌,这是因为它不是在等待AJAX去完成?但是,这是做什么呢?为什么这样?我得到test2,之后不久ajax successs。我需要它来显示test消息。有人能解释我吗?

+1

在'success'函数中测试url是否存在。按照定义,AJAX是异步的,所以js不会等待结果。相反,使用你的'成功'回调。 –

+0

AJAX是异步的。稍后会调用成功处理程序... – andlrc

+0

您还可以通过在请求的配置中传递async:false来使任何ajax请求异步。如果你不想这样做,请执行@JonathanM建议的操作:在成功回调中执行要等待ajax请求结果的代码。 – marekful

回答

1

这是因为AJAX是aynchronous,这意味着AJAX调用时并继续执行,不必等待响应回来。这就是为什么你的urlExists()在响应来临之前执行。要在响应到达后调用它,请调用成功处理程序,如下所示:

function urlExists(testUrl){ 
    var ajaxurl = 'some AJAX URL'; 
    jQuery.ajax({ 
     type: "POST", 
     url: ajaxurl, 
     data: { 
       "action": "somefunction", 
       "content": testUrl 
      }, 
     global: false, 
     success: function(){ 
      alert('ajax successs'); 
      if(urlExists(src)){ 
       alert('test'); 
      }else{ 
       alert('test2'); 
        } 
      return true; 
     }, 
     error: function(){ 
      return false; 
     } 
    }); 
    return false; 
} 

/* The AJAX function returns TRUE or FALSE 100% alright. */ 
/* The interesting part begins below. */ 
2

AJAX函数返回TRUE或FALSE 100%正常。

不,总是返回false,如其最后一行所述。

如何等待它完成?

你不能“等待”中“沉睡”的条款,因为它是一个asynchronsous任务。你将需要使用回调。随着jQuery的Deferreds,它看起来像这样:

function urlExists(testUrl){ 
    return jQuery.ajax({ 
     type: "POST", 
     url: 'some AJAX URL', 
     data: { 
       "action": "somefunction", 
       "content": testUrl 
      }, 
     global: false, 
     success: function(){ 
      alert('ajax successs'); 
     } 
    }); 
} 
urlExists(src).done(function(){ 
    alert('test'); 
}).fail(function(){ 
    alert('test2'); 
}); // returns the promise immediately, but will alert later on 
+0

感谢您的解释!出于某种原因'urlExists(src)'返回JS错误 - 函数没有定义。我在相同的范围内使用它,所以我不确定会发生什么。但是,我成功地在成功回调中工作:) – Atadj

1

您可以使您的请求异步,但我不建议使用它。任何时候,网络或服务器都不会很快响应,这会导致用户体验不佳。

function urlExists(testUrl){ 
    var result; 
    var ajaxurl = 'some AJAX URL'; 
    jQuery.ajax({ 
     type: "POST", 
     url: ajaxurl, 
     async: false, // BAD 
     data: { 
       "action": "somefunction", 
       "content": testUrl 
      }, 
     global: false, 
     success: function(){ 
      alert('ajax successs'); 
      result = true; 
     }, 
     error: function(){ 
      result = false; 
     } 
    }); 
    return result; 
} 

if(urlExists(src)){ 
    alert('test'); 
}else{ 
    alert('test2'); 
} 

推荐的方法是使用延迟对象或回调。以下是使用延迟的例子。

function urlExists(testUrl){ 
    var ajaxurl = 'some AJAX URL'; 
    return jQuery.ajax({ 
     type: "POST", 
     url: ajaxurl, 
     data: { 
       "action": "somefunction", 
       "content": testUrl 
      }, 
     global: false 
    }); 

} 

urlExists(src).done(function(){ 
    alert('test'); 
}).fail(function(){ 
    alert('test2'); 
}); 

也注意到但如果你正在测试一个跨域URL的存在,这总是会失败。

+0

第二个示例仍然显示'async:false'。需要编辑它并删除。 –

+0

@JonathanM谢谢 –