[英]Convert network request from synchronous to asynchronous (PHP/Javascript)
[英]Return value from asynchronous OR synchronous JavaScript request
下面的函數首先執行同步比較test == 0
,如果它通過,則返回一些內容,如果沒有通過,則執行異步請求。 我的意圖是讓后者返回一些其他內容,例如“來自回調后的內容”,但知道我做錯了。 在不將Ajax請求更改為同步的情況下,是否可以執行此操作?
var value = function (test) {
if (test == 0) {
return 'value is zero ';
} else {
return $.post('/echo/html/', {
html: 'false ',
delay: .5
}, function (r1) {
console.log('r1', r1);
return 'something from post callback';
})
.done(function (r2) {
console.log('r2', r2);
return 'something from done callback';
});
}
}(1);
console.log(value);
由於您已經從ajax調用返回了一個promise,然后從同步比較中返回一個已解決的promise。 然后,兩個代碼路徑都返回使用終端值解析的promise,並且調用者可以使用相同的代碼來處理結果,無論它在內部工作的方式如何。 這是代碼的常見設計模式,有時是同步的,有時是異步的。
var myFunc = function (test) {
if (test == 0) {
return $.Deferred().resolve('value is zero ');
} else {
return $.post('/echo/html/', {
html: 'false ',
delay: .5
}).then(function (r2) {
console.log('r2', r2);
// this will be the return value of the promise
return 'something from ajax finished';
});
}
};
myFunc(1).then(function(value) {
// value is here either way
});
僅供參考,在$.post()
中使用成功處理函數和.done()
處理程序是沒有意義的。 如果你要從函數中返回一個promise(這是我的推薦),那么你應該只使用promise處理程序,而不是成功回調。
您可能還需要了解從ajax調用的成功處理程序返回值沒有任何用處。 返回值只會回到ajax基礎結構的異步內容中,並且永遠不會被任何東西使用。
使所有異步:
var value = function (test, callback) {
if (test == 0) {
callback('value is zero ');
} else {
return $.post('/echo/html/', {
html: 'false ',
delay: .5
}, function (r1) {
console.log('r1', r1);
callback('something from post callback');
})
.done(function (r2) {
console.log('r2', r2);
callback('something from done callback');
});
}
}(1, function(result) { console.log(result); } );
您可以為其他人模擬異步調用,然后對所有人使用回調:
var value = function (test, callback) {
if (test == 0) {
callback('value is zero ');
} else {
return $.post('/echo/html/', {
html: 'false ',
delay: .5
}, function (r1) {
console.log('r1', r1);
callback('something from post callback');
})
.done(function (r2) {
console.log('r2', r2);
callback('something from done callback');
});
}
}(1, myCallback);
function myCallback(result) {
// here will the result be
}
您還可以使用setTimeout實際使同步調用表現為異步調用,以備您需要時使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.