Wciąż zmagam się z obietnicami, ale robię postępy dzięki społeczności tutaj.
Mam prostą funkcję JS, która wysyła zapytania do bazy danych Parse. Ma zwrócić tablicę wyników, ale oczywiście ze względu na asynchroniczny charakter zapytania (stąd obietnice) funkcja zwraca przed wynikami, pozostawiając mnie z niezdefiniowaną tablicą.
Co muszę zrobić, aby ta funkcja czekała na wynik obietnicy?
Oto mój kod:
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
źródło
źródło
Odpowiedzi:
Zamiast
resultsArray
zwracać a, zwracasz obietnicę dla tablicy wyników, a następniethen
tę w witrynie wywołania - ma to dodatkową zaletę, że wywołujący wie, że funkcja wykonuje asynchroniczne operacje we / wy. Na tym opiera się współbieżność kodowania w JavaScript - możesz przeczytać to pytanie, aby uzyskać szersze pojęcie:Więcej przykładów użycia obietnic parsowania z zapytaniami można znaleźć we własnym poście w blogu Parse na ten temat .
źródło
Użyj
async/await
(NIE jest częścią ECMA6, ale dostępne dla Chrome, Edge, Firefox i Safari od końca 2017 r., Patrz canIuse )MDN
Dodano komentarz: Funkcja asynchroniczna zawsze zwraca Obietnicę, aw TypeScript wyglądałaby tak:
źródło
Nie chcesz, aby funkcja czekała, ponieważ JavaScript ma nie blokować. Zamiast zwracać obietnicę na końcu funkcji, funkcja wywołująca może użyć obietnicy do uzyskania odpowiedzi serwera.
źródło
success:
bitem jest wyłączona.return query.find();
.W rzeczywistości nie używasz tutaj obietnic. Parse pozwala na użycie wywołań zwrotnych lub obietnic; Twój wybór.
Aby skorzystać z obietnic, wykonaj następujące czynności:
Teraz, aby wykonać rzeczy po zakończeniu obietnicy, możesz po prostu wykonać ją w wywołaniu zwrotnym obietnicy w
then()
wywołaniu. Jak dotąd byłoby to dokładnie to samo, co zwykłe wywołania zwrotne.Aby rzeczywiście dobrze wykorzystać obietnice, należy je połączyć w łańcuch, na przykład:
źródło
Parse.Object
.