2013-05-19 3 views
0

У меня есть код JavaScript, который извлекает данные из 2 источников.Сделать асинхронный метод Синхронный javascript

первый источник является локальным веб-хранилище

второго источника является запрос AJAX.

Условие простое:

function getMyData(){ 
    if (window.localStorage['myData'] != null) 
    { 
     return window.localStorage['myData']; 
    } 
    else 
    { 
     networkTools.ajax("geyMyData", function (data) 
     { 
      return data; 
     }) 
    }} 

Но проблема заключается в том, что AJAX является процесс асинхронной, и я не хочу, чтобы код не будет продолжаться до getMyData() возвращения чего-то.

Я знаю, что могу использовать обратные вызовы, но хотел бы просто подождать, пока эта функция ничего не вернет, а затем продолжит выполнение. (Не только для этого случая, но и для общих знаний.)

Возможно ли это?

+0

Что такое 'networkTools'? –

+0

networkTools - это только мой класс-оболочка для jquery ajax – jekcom

+3

Извините; вам нужно использовать обратные вызовы. Однако обещания могут сделать это намного проще. – SLaks

ответ

2

Использование обратного

function getMyData(callback){ 
     if (window.localStorage['myData'] != null) 
     { 
      callback(window.localStorage['myData'];) 
     } 
     else 
     { 
      networkTools.ajax("geyMyData", function (data) 
      { 
       callback(data); 
      }) 
     } 
    } 

Как звонить getMyData

getMyData(function(data){ 
     //your code 
}); 

Или вы можете сделать запрос Ajax в качестве синхронного запроса.

1

Лучший способ сделать это с помощью функции обратного вызова.

Вы не хотите, чтобы ваш JavaScript блокировал такие вещи, как сетевые запросы, потому что ваша веб-страница станет полностью неактуальной.

Это, как вы могли бы сделать это:

function getMyData(callback){ 
    if (window.localStorage['myData'] != null) 
    { 
     return window.localStorage['myData']; 
    } 
    else 
    { 
     networkTools.ajax("geyMyData", function (data) 
     { 
      callback(data); 
     }); 
    } 
} 
0

Наилучшим вариантом было бы назвать getMyData с обратного вызова и разорвать ваши функции вверх в вызывающему -> getMyData -> обратного вызова. можно выполнить синхронный запрос, но лучше не потому, что он блокирует браузер до тех пор, пока вызов не будет выполнен.

function gotData(data){ 
    console.log("got data:",data); 
} 
function someFunction(){ 
... 
getMyData(gotData); 
} 
    function getMyData(callback){ 
    if (window.localStorage['myData'] != null) 
    { 
     callback(window.localStorage['myData']); 
    } 
    else 
    { 
     networkTools.ajax("geyMyData", function (data) 
     { 
      callback(data); 
     }) 
    }} 

я не включал, как сделать синхронный запрос, потому что это плохо, чтобы сделать это, но если вы действительно хотите сделать это, чем, как это можно найти в любом месте (например, MDN developer.mozilla.org/en- US/docs/DOM/XMLHttpRequest)

Смежные вопросы