Функция asyncCallWrapper должна возвращать обещание вместо отложенного. Отложенные средства предназначены для внутреннего использования, чтобы контролировать, когда/как код завершается.
function asyncCallWrapper() {
return $.Deferred(function(def) { asyncCallFunction(arg1, function (//Fires a callback when completed
def.resolve(data);
))).promise();//return the deferred's promise instead of the deferred itself.
}
$ .when - служебная функция, предназначенная для обертывания нескольких обещаний в отложенном состоянии.
$.when(asyncCallWrapper(), asyncCallWrapper(), asyncCallWrapper())
.done(function(dataFromAsyncCall1, dataFromAsyncCall2, dataFromAsyncCall3) {
console.log("<ALL> three async calls are successful");
});
Таким образом, она не нужна, и вы можете просто написать
asyncCallWrapper()
.done(function(dataFromAsyncCall) {
alert(dataFromAsyncCall);
result = dataFromAsyncCall;
});
Причина предупреждения (результат) является пустая строка, потому что реальная работа еще не произошло. В этот момент кода вы просто сказали приложению, что он должен делать, когда заканчивается asyncCallWrapper. На данный момент это еще не закончилось.
В вашем случае вы хотите прочитать данные после того, как они были установлены через некоторое время. Это то, что откладывается.
asyncCallWrapper()
.done(function(dataFromAsyncCall) {
alert(dataFromAsyncCall);
result = dataFromAsyncCall;
})
.then(function() {
alert(result);//should be dataFromAsyncCall
});
После прочтения ваших комментариев, я увидел, что вы хотите немедленно использовать результат. Это невозможно с отсрочкой. Вам придется реорганизовать код, которому требуется значение для вызова, а затем по обещанию.
Вам нужно научиться использовать обещания. – SLaks