[英]How to change javascript variable at appropriate scope based on success/failure of ajax get request
我想根據文件是否存在來編輯javascript變量。 我能實現這樣的目標嗎?
var url="Content/Features/column1.html";
var url2="";
$.ajax({
url: url,
error: function()
{
url2 = "something";
},
success: function()
{
url2 = "something else";
}
});
我的理解是這里的典型問題是ajax中的異步。 我應該以某種方式使用回調方法或承諾嗎?
也許是這樣的:
var url="Content/Features/column1.html";
var url2="";
var result = $.ajax({
url: url,
error: function()
{
url2 = "something";
handleData(url2);
},
success: function()
{
url2 = "something else";
handleData(url2);
}
});
response = function handleData( responseData ) {
return responseData;
}
甚至:
var url="Content/Features/column1.html";
var url2="";
function test(url) {
return $.ajax(
{
url: url
}
);
}
test().done(function(url2) {
url2= "something"
}).fail(function() {
url2= "something else"
});
如何在聲明它的同一范圍內更改url2? 或者有沒有辦法從回調函數返回一個值並根據它更改url2?
或者,是否有更好的方法來檢查此文件是否存在? (在你告訴我瀏覽器不允許對本地文件的ajax請求之前,請知道我使用的是node-webkit,而不是瀏覽器)
這些嘗試都沒有奏效,但如果我接近,請告訴我。 非常感謝您的參與。
由於AJAX本質上是異步的,因此無法從函數返回值,而是需要實現回調。 你可以這樣做:
function getURL2(callback) {
callback = callback || function() {};
var url="Content/Features/column1.html";
var url2="";
$.ajax({
url: url,
error: function()
{
callback("something");
},
success: function()
{
callback("something else");
}
});
}
getURL2(function(url2) {
// the call is complete and url2 is set correctly!
}
嘗試
var url1 = "Content/Features/column1.html"
, res = {"url2": void 0} // `this` `context` within `$.ajax` call at `request`
, request = function request(url1, res) {
return $.ajax({
context: res // set `this` to `res` object
, url: url1
, method: "GET"
, success: function(data, textStatus, jqxhr) {
this.url2 = "something"; // `success`
return this // return `this` : `res`
}
, error: function(jqxhr, textStatus, errorThrown) {
this.url2 = jqxhr.status === 404 // `404` , `Not Found`
? "somethingElse" // `error`
// if `error` other than `404`,
// return `jqxhr.status`
: jqxhr.status;
return this // return `this` : `res`
}
});
};
request(url1, res).always(function(response) {
// `this` : `res`
console.log(response.status
, response.statusText
, response.state()
, this.url2); // if `error` , `somethingElse` , else `something`
});
在context
查看jQuery.ajax([settings]) , deferred.always()
var url1 = "https://gist.githubusercontent.com/anonymous/9a6997f09de9b68c59b2/" + "raw/f7d7b756005ad6d2b88cf0211f78a2990d7d2dc7" + "123" // `404` `error` , res = {"url2":void 0} , request = function request(url1, res) { return $.ajax({ context: res , url: url1 , method: "GET" , success: function(data, textStatus, jqxhr) { this.url2 = "something"; return this } , error: function(jqxhr, textStatus, errorThrown) { this.url2 = jqxhr.status === 404 ? "somethingElse" : jqxhr.status; return this } }); }; request(url1, res).always(function(response) { console.log(response.status , response.statusText , response.state() , this.url2); document.write(JSON.stringify(this)) });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.