Вы можете установить его синхронность, добавив опцию 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 для тестирования, что может иметь побочные эффекты и сделать тесты недействительными, я настоятельно рекомендую вместо этого сделать вашу среду тестирования асинхронной. Платформа асинхронного тестирования может выполнять синхронные тесты; синхронный тестовый фреймворк не может выполнять асинхронные тесты. Таким образом, структура должна быть асинхронной ...
Я бы также настоятельно посоветовал не использовать собственную тестовую среду. Есть куча из них, которые вы можете выбрать из , не создавая свои собственные.
Обновление : ... но если вы действительно хотите создать свой собственный, вот очень простой пример того, что я имею в виду, что нетрудно сделать фреймворк асинхронным ( 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);
}
});