Как подождать завершения обещания, прежде чем возвращать переменную функции?
Я все еще борется с promises, но сделаю некоторый прогресс благодаря сообществу здесь.
У меня есть простая функция JS, которая запрашивает базу данных Parse. Он должен возвращать массив результатов, но, очевидно, из-за асинхронного характера запроса (следовательно, promises) функция возвращается до результатов, оставляя меня с массивом undefined.
Что мне нужно сделать, чтобы заставить эту функцию ждать результата обещания?
Здесь мой код:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
var promise = query.find({
success: function(results) {
// results is an array of Parse.Object.
console.log(results);
//resultsArray = results;
return results;
},
error: function(error) {
// error is an instance of Parse.Error.
console.log("Error");
}
});
}
Ответы
Ответ 1
Вместо возврата resultsArray
вы возвращаете обещание для массива результатов, а затем then
, что на сайте вызова - это имеет дополнительное преимущество вызывающего устройства, зная, что функция выполняет асинхронный ввод-вывод. Кодирование concurrency в JavaScript основано на этом - вы можете прочитать этот вопрос, чтобы получить более широкую идею:
function resultsByName(name)
{
var Card = Parse.Object.extend("Card");
var query = new Parse.Query(Card);
query.equalTo("name", name.toString());
var resultsArray = [];
return query.find({});
}
// later
resultsByName("Some Name").then(function(results){
// access results here by chaining to the returned promise
});
Вы можете увидеть больше примеров использования parse promises с запросами в Прокомментировать собственное сообщение в блоге.
Ответ 2
Вы не можете заставить функцию ждать.
Скорее верните обещание в конце функции, тогда вызывающая функция может использовать обещание получить ответ сервера.
var promise = query.find();
return promise;
//Or return query.find();
Ответ 3
Здесь вы не используете promises. Parse позволяет использовать обратные вызовы или promises; ваш выбор.
Чтобы использовать promises, выполните следующие действия:
query.find().then(function() {
console.log("success!");
}, function() {
console.log("error");
});
Теперь, чтобы выполнить материал после завершения обещания, вы можете просто выполнить его в обратном вызове обещания внутри вызова then()
. Пока это будет точно так же, как обычные обратные вызовы.
Чтобы эффективно использовать promises, когда вы их связываете так:
query.find().then(function() {
console.log("success!");
return new Parse.Query(Obj).get("sOmE_oBjEcT");
}, function() {
console.log("error");
}).then(function() {
console.log("success on second callback!");
}, function() {
console.log("error on second callback");
});
Ответ 4
Что мне нужно сделать, чтобы заставить эту функцию ждать результата обещания?
Используйте async/await
(НЕ входит в ECMA6, но доступный для Chrome, Edge, Firefox и Safari с конца 2017 года, см. canIuse)
MDN
async function waitForPromise() {
let result = await Promise.resolve('this is a sample promise');
}
В качестве побочного элемента: С# имеет это уже несколько лет (!).