您可以設置它通過將async: false
選項,您的來電是同步的,但你的函數仍然不會返回任何東西,因爲在成功回調return
語句從回調返回,而不是主功能。
如果我讀你的權利,然後(與*
標記的變化):
function SomeAjaxService(webServiceUrl)
{
this.getSomeModel = function(someUniqueId){
var rv; // *
var ajaxOptions = {
url: webServiceUrl,
async: false, // *
data: {id : someUniqueId},
Success: function(data) { rv = new SomeModel(data); } // *
};
$.ajax(ajaxOptions);
return rv; // *
};
}
但是,而不是讓你的AJAX測試要求同步,這可能也有副作用,使測試無效,我強烈建議讓你的測試框架異步。一個異步測試框架可以執行同步測試;一個同步測試框架不能執行異步測試。所以框架應該是異步的...
我也想強烈建議不要滾動自己的測試框架。有沒有建立自己的a bunch of ones you can choose from。
更新:...但如果你真的想建立自己的,下面是我的意思是不是很難使框架異步(live copy)一個很簡單的例子:
jQuery(function($) {
$("#theButton").click(function() {
var tests, testIndex, nesting;
tests = [
function(cb) { display("I'm test1: sync"); cb(1); },
function(cb) { display("I'm test2: async"); setTimeout(function() {
cb(2);
}, 0); },
function(cb) { display("I'm test3: sync"); cb(3); },
function(cb) { display("I'm test4: async"); setTimeout(function() {
cb(4);
}, 0); }
];
nesting = 0;
testIndex = 0;
doTest();
function doTest() {
if (testIndex >= tests.length) {
return true; // Done
}
++nesting;
oneTest(tests[testIndex++]);
--nesting;
return false;
}
function testDone(result) {
display("Result: " + result);
if (nesting > 0) {
// Completion was called synchronously; schedule next
// test asynchronously to avoid recursing too deeply.
// You could use a higher number than 0 to allow *some*
// recursion for efficiency but avoid letting too much
// occur.
display("r"); // Just for demonstrating that it happens
setTimeout(doTest, 0);
}
else {
// We were already called asynchronously, start next
doTest();
}
}
function oneTest(test) {
test(testDone);
}
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
});
[見這個答案](https://stackoverflow.com/ a/32136316/7735285),通過一些定製,你將得到一個美妙的** ajax包裝**從任何頁面的任何地方打電話。 – wpcoder