표준 확장 포인트를 제공하는 자바스크립트 위젯이 있습니다. 그 중 하나가 beforecreate
함수입니다. 이 함수는 항목이 생성되지 않도록 false
를 반환해야 합니다.
이 함수에 jQuery를 사용하여 Ajax 호출을 추가했습니다:
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
하지만 위젯이 항목을 생성하지 못하게 하려면 콜백이 아닌 모 함수에서 false
를 반환해야 합니다. jQuery 또는 다른 브라우저 내 API를 사용하여 동기식 AJAX 요청을 수행할 수 있는 방법이 있나요?
jQuery 문서]1에서: 동기식 Ajax 요청을 받으려면 asynchronous 옵션을 false로 지정합니다. 그러면 콜백이 마더 함수가 진행되기 전에 일부 데이터를 설정할 수 있습니다.
제안한 대로 변경한 코드는 다음과 같습니다:
beforecreate: function (node, targetNode, type, to) {
jQuery.ajax({
url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
success: function (result) {
if (result.isOk == false) alert(result.message);
},
async: false
});
}
다음을 호출하여 jQuery의 Ajax 설정을 동기 모드로 설정할 수 있습니다.
jQuery.ajaxSetup({async:false});
그런 다음 jQuery.get( ... );
을 사용하여 Ajax 호출을 수행합니다.
그런 다음 다시 한 번 켜면 됩니다.
jQuery.ajaxSetup({async:true});
아담이 제안한 것과 같은 방식으로 작동하는 것 같지만, jQuery.get()
또는 jQuery.post()
를 좀 더 정교한 jQuery.ajax()
구문으로 재구성하려는 사람에게는 도움이 될 수 있습니다.
훌륭한 솔루션입니다! 구현을 시도했을 때 성공 절에서 값을 반환하면 정의되지 않은 상태로 되돌아오는 것을 발견했습니다. 그래서 변수에 저장하고 그 변수를 반환해야 했습니다. 이것이 제가 생각해낸 방법입니다:
function getWhatever() {
// strUrl is whatever URL you need to call
var strUrl = "", strReturn = "";
jQuery.ajax({
url: strUrl,
success: function(html) {
strReturn = html;
},
async:false
});
return strReturn;
}
Ajax 와 전화 통화를 하고 있는 이 모든 질문에 중심을 잃고 있는 비동기 브라우저 멈춤으로 보살피되 Ajax 요청을 하면 거짓값 완료하는지.: 이 문제를 해결할 수 없는 흐름 제어를 사용하여 라이브러리 내어쓰기는 up the 브라우저. 예를 들어보겠습니다 와 [프라임.j스] (https://github.com/bishopZ/Frame.js):
beforecreate: function(node,targetNode,type,to) {
Frame(function(next)){
jQuery.get('http://example.com/catalog/create/', next);
});
Frame(function(next, response)){
alert(response);
next();
});
Frame.init();
}
$.ajax({
url: "testserver.php",
dataType: 'jsonp', // jsonp
async: false //IGNORED!!
});
제슨프 페이징됩니다 위해 사용할 수 있습니다.
참고: # 39, t '비동기 shouldn& 사용할 수 있습니다. 이 때문에 거짓값 '경고 메시지:
>. 게코 (30.0 시몽키 2.27 / 파이어폭스 / 선더버드 30.0), 동기식 30.0 시작으로 주 요청률 스레드할 사용되지 않는 악영향을 미칠 수 있기 때문에 사용자 경험.
물론 이에 대한 경고가 크롬 콘솔:
>. 주 동기식 스믈하트프리퀘스트 는 사용되지 큰 효과를 스레드할 상태였기 때문에 끝까지 user& # 39 의 경험하십시오. 자세한 내용은 https://xhr.spec.whatwg.org/ 선택합니다.
이 경우 이 같은 일을 막을 수 있을 apc® 페이지에 손상될 수 있으므로 어느 날.
스케쳐내 방식으로 할 경우, 그래도 여전히 feels like it& # 39, 동기 / 비동기 있을 수도 있고 또한 그 t # 39 don& 블록이어야 콩지름에 약속 같은 일부 ajax 기반으로 하는 새로운 [페치할] (https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) API
async function foo() {
var res = await fetch(url)
console.log(res.ok)
var json = await res.json()
console.log(json)
}
이 경우 해당 览侩 荤례 단순화표현 보면 [나비가토리젠드베이컨] (https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon) 을 대신 할 수 있습니다.
또한 페이지 수 있는 속성 또는 iframe& # 39 의 허용하시겠습니까 http 헤더를 동기화됨 비활성화하려면 필요
내가 사용한 카시오네 및 수정날짜 사용하도록 이를 JSON 오토메이티드 주어진다.
function getUrlJsonSync(url){
var jqxhr = $.ajax({
type: "GET",
url: url,
dataType: 'json',
cache: false,
async: false
});
// 'async' has to be 'false' for this to work
var response = {valid: jqxhr.statusText, data: jqxhr.responseJSON};
return response;
}
function testGetUrlJsonSync()
{
var reply = getUrlJsonSync("myurl");
if (reply.valid == 'OK')
{
console.dir(reply.data);
}
else
{
alert('not valid');
}
}
나는 , 와 # 39 의 & # 39, 데이터 형식 추가했어야 로 레스폰세이슨 .responseText JSON& 바꿨다.
난 상태 읽어들여집니다 속성을 사용하여 statusText 반환된 객체에는. 참고, Ajax 를 JSON 응답을 이 상태입니까 여부는 아직 유효합니다.
백 엔드 는 JSON 응답을 반환되기를 정확한 (잘 구성된), 그렇지 않으면 반환된 객체에는 적립율은 정의되지 않았습니다.
두 가지 측면을 고려할 때 하고 원래 질문. 하나는 동시에 수행할 수 있도록 말하는 아약스 ( 설정하여 비동기: 거짓값 ) 와 다른 하나는 돌아오는 응답, s return 문을 통해 function& 호출하십시오 # 39 에 아니라 콜백 함수.
난 또 함께 이 로그하고 된다고 했다.
function postUrlJsonSync(url, postdata){
var jqxhr = $.ajax({
type: "POST",
url: url,
data: postdata,
dataType: 'json',
cache: false,
async: false
});
// 'async' has to be 'false' for this to work
var response = {valid: jqxhr.statusText, data: jqxhr.responseJSON};
return response;
}
참고로, 위의 코드는 거짓값 때만 이 필요한 경우 비동기 있다. 비동기 조교하실 경우 설정할 수 있습니다. 진정한 반환된 객체에는 이크스어 않을 뿐, AJAX 호출 유효함 당시 되돌려줍니다 비동기 호출 끝났을 때 훨씬 나중에 늦었음요 설정할 수 있지만 반응 = * 변수.
함께 '비동기: 거짓값 '확보하십시오 교도관님도요 차단된 브라우저. Kingdome. seattle. 비차단 동기화 솔루션 다음 사용할 수 있습니다.
Es6 발생기입니다 & 함께 사용할 수 있습니다. 이 co 라이브러리란:
beforecreate: function (node, targetNode, type, to) {
co(function*(){
let result = yield jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value));
//Just use the result here
});
}
그냥 기다리는 라이스 ES7 함께 사용할 수 있습니다.
beforecreate: function (node, targetNode, type, to) {
(async function(){
let result = await jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value));
//Just use the result here
})();
}
Ajax 요청을 하는 등 낮은 수준의 제어할 때 우리는 reques 헤더입니다 설정, 캐싱과는 돌아가는게 레콘스탕 스이제이스트 달러 에 설정, 동기식 설정
$ $ .get/ 스포스트: Ajax 요청을 제어할 때 낮은 수준의 필요하지 않습니다. Get / post 는 미디어만을 간단한 데이터를 erver.*It 의 대표
$.ajax({
url: url,
data: data,
success: success,
dataType: dataType
});
그에 따라 다른 기능을 사용할 수 없다 (동기화, 캐시 등) 를 .get/ 스포스트리 $ $
$.ajax({
type: 'GET',
url: url,
data: data,
success: success,
dataType: dataType,
async:false
});
이건 내 간단한 구현을 위한 비동기 가진 요청을 포함한다. 이 누구에게도 도움이 됐으면 좋겠다 "고 말했다.
var queueUrlsForRemove = [
'http://dev-myurl.com/image/1',
'http://dev-myurl.com/image/2',
'http://dev-myurl.com/image/3',
];
var queueImagesDelete = function(){
deleteImage( queueUrlsForRemove.splice(0,1), function(){
if (queueUrlsForRemove.length > 0) {
queueImagesDelete();
}
});
}
var deleteImage = function(url, callback) {
$.ajax({
url: url,
method: 'DELETE'
}).done(function(response){
typeof(callback) == 'function' ? callback(response) : null;
});
}
queueImagesDelete();
'나' 는 사용되지 않기 때문에 스믈하트프리폰세 동기화 작업을 지었지 솔루션으로 스믈하트프리퀘스트 둘러싸여집니다 '다음'. 따라서, 이는 매우 유용하게 사용할 수 있는 자연 상태에서 순서화된 아약스 쿼리합니다 기술입니까 라이스 로누스 회용 치프 토큰.
또한 같은 투명해집니다 그러하매 jQuery 라이브러리를 원활하게 작동할 것이다.
/* wrap XMLHttpRequest for synchronous operation */
var XHRQueue = [];
var _XMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function()
{
var xhr = new _XMLHttpRequest();
var _send = xhr.send;
xhr.send = function()
{
/* queue the request, and if it's the first, process it */
XHRQueue.push([this, arguments]);
if (XHRQueue.length == 1)
this.processQueue();
};
xhr.processQueue = function()
{
var call = XHRQueue[0];
var xhr = call[0];
var args = call[1];
/* you could also set a CSRF token header here */
/* send the request */
_send.apply(xhr, args);
};
xhr.addEventListener('load', function(e)
{
/* you could also retrieve a CSRF token header here */
/* remove the completed request and if there is more, trigger the next */
XHRQueue.shift();
if (XHRQueue.length)
this.processQueue();
});
return xhr;
};
이것은 나의 이름공간이 " 스레드할 ":
var Thread = {
sleep: function(ms) {
var start = Date.now();
while (true) {
var clock = (Date.now() - start);
if (clock >= ms) break;
}
}
};
And this is how I call it:
var d1 = new Date();
console.log('start ' + d1.toLocaleTimeString());
Thread.sleep(10000);
var d2 = new Date();
console.log('end ' + d2.toLocaleTimeString());
만일 우리가 바라보는 콘솔입니다 내려받습니다 정보정의다음 결과:.
start 1:41:21 PM
end 1:41:31 PM