Как извлечь значение из обещания [дубликата]

1

Я работал над проектом, и мне нужна помощь в этом: у меня есть обещание внутри функции, и мне нужно вернуть значение "current", чтобы я мог использовать его в другом месте. Я извлекаю данные из Firebase, затем перетасовываю результат и извлекаю только 10 элементов из результата.

function retriveData() {

//declaration of variables ...

axios.get("Firebase link")
    .then((response) => {
        keyArray = Object.keys(response.data);
        let k = shuffle(keyArray); 
        //shuffle is a function to shuffle the key results
        for (var i = 0; i < 10; ++i) {
            current[i] = response.data[k[i]];
        }
    });
return current;} //I want this variable to end up with the promise result in current

Я знаю, это не то, как обещают работу, но мне нужно решение для решения этой проблемы. Спасибо!

  • 0
    Вы хотите сделать свою функцию retriveData в качестве Promise
  • 0
    Каким бы ни было решение, важно вернуть значение «current», чтобы я мог использовать его в другом месте кода. Спасибо.
Теги:

2 ответа

0
Лучший ответ

axios.get является асинхронным, поэтому либо вы передаете обратный вызов для retrieveData, либо ему нужно вернуть сам Promise. Нет.

Использование обратного вызова (без обработки ошибок):

function retriveData(callback) {
  axios.get("Firebase link")
    .then((response) => {
      keyArray = Object.keys(response.data);
      let k = shuffle(keyArray); 
      //shuffle is a function to shuffle the key results
      for (var i = 0; i < 10; ++i) {
        current[i] = response.data[k[i]];
      }

      callback(null, current);
    });
}

retrieveData((err, result) => console.log(result));

Использование Promise (без обработки ошибок):

function retriveData() {
  return new Promise((resolve) => {
    axios.get("Firebase link")
      .then((response) => {
        keyArray = Object.keys(response.data);
        let k = shuffle(keyArray); 
        //shuffle is a function to shuffle the key results
        for (var i = 0; i < 10; ++i) {
          current[i] = response.data[k[i]];
        }

        resolve(current);
    });
}

retrieveData().then((result) => console.log(result));

[EDIT] Вышеприведенный пример является средним для иллюстративных целей. Поскольку axios.get уже возвращает Promise, его можно вернуть обратно непосредственно из retrieveData.

function retriveData() {
  return axios.get("Firebase link")
    .then((response) => {
      keyArray = Object.keys(response.data);
      let k = shuffle(keyArray); 
      //shuffle is a function to shuffle the key results
      for (var i = 0; i < 10; ++i) {
        current[i] = response.data[k[i]];
      }

      return current;
    });
}

retrieveData().then((result) => console.log(result));
  • 0
    Работало отлично, спасибо.
  • 0
    Вам не нужно Axios.get() обещание, возвращаемое Axios.get() в ваше собственное обещание, это анти-паттерн. Просто верните цепочку обещаний, которую Axios.get() уже дал вам.
Показать ещё 1 комментарий
0

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

function retriveData() {

//declaration of variables ...
return new Promise((resolve, reject) => {

axios.get("Firebase link")
    .then((response) => {
        keyArray = Object.keys(response.data);
        let k = shuffle(keyArray); 
        //shuffle is a function to shuffle the key results
        for (var i = 0; i < 10; ++i) {
            current[i] = response.data[k[i]];
        }
       // if everything fine, if you get any conditional error then call reject();
       resolve(current);
    });
})
}


//call the function like promise
retriveData().then(result => {
//current will come here
     console.log('result comes here');
}).catch(error => {
    //error comes here (reject error)
   console.log('error');

})
  • 0
    Мое удовольствие @HaithamHirt

Ещё вопросы

Сообщество Overcoder
Наверх
Меню