Как вернуть значение из асинхронной функции?

Madzal

Как правильно возвратить значение в этой функции ?

function getValue(variable, defaultvalue) {
  chrome.storage.sync.get({
    [variable]: defaultvalue,
  }, function(items) {
    if (items[variable]) {
      return items[variable];
    }
  });
}

Вот так не получается,а если return items[variable] заменить на alert(items[variable]) то успешно выводиться что нужно,а если с return то возвращает undefined. Нужно чтобы при alert(getValue('test', 'var')) возвращалось то, что мне нужно, а не undefined .

1 ответ

Madzal

Так как в данном случае функция getValue ничего не возвращает, то результат выполнения

getValue(variable, defaultvalue)

всегда будет undefined.

Возможные пути решения:

  1. Пробросить callback - функцию, которая будет вызвана при успешном выполнении, например

    function getValue(variable, defaultvalue, successCallback) {
      chrome.storage.sync.get({
        [variable]: defaultvalue,
      }, function(items) {
        if (items[variable]) {
          successCallback(items[variable]);//вызываем callback если все хорошо
        }
      });
    }

    И вызывать ее следующим образом:

    getValue(variable, defaultvalue, function(items){//items внутри этой функции - будут нужным значением
        ... 
    })
  2. Можно использовать Promise, например так:

    function getValue(variable, defaultvalue, successCallback) {
        return new Promise(function(resolve, reject){
            chrome.storage.sync.get({
                [variable]: defaultvalue,
            }, function(items) {
                if (items[variable]) {
                    resolve(items[variable]);//говорим что все хорошо
                }else{
                    reject(/*тут можно указать причину почему все плохо*/);
                }
            });
    
        });
    }

    И использовать так

    getValue(variable, defaultvalue).then(function success(items){//items внутри этой функции - будут нужным значением
        ... 
    });

licensed under cc by-sa 3.0 with attribution.