Как получить значение с callback функции?

311
25 мая 2017, 10:39

Есть некий запрос к IndexedDB

function GetData(storename,index,callback) 
    {
        var openReq = indexedDB.open("catalogs");
        openReq.onsuccess = function() 
        {

            var db = openReq.result;
            var transaction = db.transaction([storename], "readwrite");
            var objectStore = transaction.objectStore(storename);
            var objectStoreRequest = objectStore.get(index);
            var store=null;  
              objectStoreRequest.onsuccess =function(event)
              {
              store =objectStoreRequest.result;

              return store;
              }
              transaction.oncomplete = function(event)
              {
                db.close();
                if(callback)
                    callback(store);
              }
        }
    }

Я хочу записать значение в какуюто переменную вот так:

var result;
GetData('pesticides',i,function(res){result=res;  });  
console.log(result);

Но значение result вне области видимости и в консоль возвращается undefined.

Answer 1

Ужасное форматирование кода, никакого codestyle это раз. Во вторых нет проверки что typeof callback === 'function' это два. Используйте промисы и promises api. Придется переписать код функции под промисы.

function GetData (storename, index) {
  return new Promise(function (resolve, reject) {
    var openReq = indexedDB.open("catalogs")
    openReq.onsuccess = function () {
      var db = openReq.result
      var transaction = db.transaction([storename], "readwrite")
      var objectStore = transaction.objectStore (storename)
      var objectStoreRequest = objectStore.get (index)
      var store = null
      objectStoreRequest.onsuccess = function (event) {
        store = objectStoreRequest.result
        resolve(store)
      }
      transaction.oncomplete = function (event) {
        db.close()
        resolve(store)
      }
    }
  }
}

Потом в коде где надо получить результат пишите

GetData('sss', 2).then(function (data) {
  //в data лежит результат resolve(store)
}, function () {
  //Обработка ошибки
})

Не забывайте что код асинхронный

п.с. в коде возможно ошибки есть, кажется не закрыл скобку
п.с.с Я не знаю как работает ваш код, но мне кажется там очень много лишних переменных

Answer 2

Так не получится.

Чтобы работало или метод должен быть синхронным (плохо, плохо, плохо!) или result должен быть глобальным, относительно callback'а, а еще лучше перенести по возможности обработку в колбэк.

var result; 
function processResult(resultData) {
// ..
}
GetData('pesticides', i, processResult);
READ ALSO
Скрытие блоков jQuery

Скрытие блоков jQuery

Доброго времени суток,

281
SCE baseline region

SCE baseline region

Есть карта распределения тарифов SCE(Southern California Edison) по регионамНеобходимо определить к какому региону относится конкретный адрес, найти...

202
Треугольник адаптивно?

Треугольник адаптивно?

Подскажите пожалуйста, как сделать блок с текстом как на картинке, чтобы если текст расширяет блок триугольник растягивался вместе с блоком

364