Я работал над проектом, и мне нужна помощь в этом: у меня есть обещание внутри функции, и мне нужно вернуть значение "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
Я знаю, это не то, как обещают работу, но мне нужно решение для решения этой проблемы. Спасибо!
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));
Axios.get()
обещание, возвращаемое Axios.get()
в ваше собственное обещание, это анти-паттерн. Просто верните цепочку обещаний, которую Axios.get()
уже дал вам.
Попробуйте это: я делаю вашу функцию 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');
})
Promise