Я все еще борюсь с обещаниями, но добиваюсь некоторого прогресса благодаря сообществу здесь.
У меня есть простая функция JS, которая запрашивает базу данных Parse. Предполагается, что он должен возвращать массив результатов, но, очевидно, из-за асинхронного характера запроса (отсюда и обещания), функция возвращает до результатов, оставляя мне неопределенный массив.
Что мне нужно сделать, чтобы эта функция ожидала результата обещания?
Вот мой код:
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");
}
});
}
javascript
parse-platform
promise
mac_55
источник
источник
Ответы:
Вместо возврата
resultsArray
вы возвращаете обещание для массива результатов, а затемthen
на сайте вызова - это дает дополнительное преимущество вызывающей стороне, зная, что функция выполняет асинхронный ввод-вывод. На этом основано параллельное кодирование в JavaScript - вы можете прочитать этот вопрос, чтобы получить более широкую идею:Вы можете увидеть больше примеров использования обещаний разбора с запросами в собственном сообщении Parse об этом .
источник
Используйте
async/await
(НЕ является частью ECMA6, но доступно для Chrome, Edge, Firefox и Safari с конца 2017 года, см. CanIuse )MDN
Добавлено из-за комментария: асинхронная функция всегда возвращает Promise, а в TypeScript это будет выглядеть так:
источник
Вы не хотите заставлять функцию ждать, потому что JavaScript должен быть неблокирующим. Вместо этого верните обещание в конце функции, тогда вызывающая функция может использовать обещание, чтобы получить ответ сервера.
источник
success:
битом отключена.return query.find();
.Вы на самом деле не используете обещания здесь. Parse позволяет использовать обратные вызовы или обещания; твой выбор.
Чтобы использовать обещания, сделайте следующее:
Теперь, чтобы выполнить материал после завершения обещания, вы можете просто выполнить его внутри обратного вызова обещания внутри
then()
вызова. Пока это будет точно так же, как обычные обратные вызовы.На самом деле, чтобы эффективно использовать обещания - это когда вы их связываете, вот так:
источник
Parse.Object
s.