Postępuję zgodnie ze specyfikacją tutaj i nie jestem pewien, czy pozwala ona na wywołanie onFulfilled z wieloma argumentami. Na przykład:
promise = new Promise(function(onFulfilled, onRejected){
onFulfilled('arg1', 'arg2');
})
taki, że mój kod:
promise.then(function(arg1, arg2){
// ....
});
otrzyma oba arg1
i arg2
?
Nie obchodzi mnie, jak robi to jakakolwiek konkretna realizacja obietnic, chciałbym ściśle przestrzegać specyfikacji w3c dotyczących obietnic.
javascript
promise
badunk
źródło
źródło
Odpowiedzi:
Nie, tylko pierwszy parametr będzie traktowany jako wartość rozdzielczości w konstruktorze obietnicy. Możesz rozwiązać za pomocą wartości złożonej, takiej jak obiekt lub tablica.
Myślę, że właśnie tam się mylisz. Specyfikacja została zaprojektowana jako minimalna i została stworzona do współdziałania między bibliotekami obietnic. Chodzi o to, aby mieć podzbiór, który na przykład DOM futures może niezawodnie wykorzystywać, a biblioteki mogą wykorzystywać. Implementacje Promise
.spread
od jakiegoś czasu robią to, o co prosisz . Na przykład:Z Bluebird . Jednym z rozwiązań, jeśli chcesz mieć tę funkcjonalność, jest wypełnienie jej.
Dzięki temu możesz:
Z rodzimymi obietnicami swobodnie bawią się . Lub użyj spreadu, który jest teraz (2018) powszechny w przeglądarkach:
Lub z oczekiwaniem:
źródło
.spread
jak Bluebird - powodem, dla którego nie ma tego w specyfikacji, jest to, że utrzymanie minimalnej specyfikacji jest naprawdę poważną sprawą , aby umożliwić współdziałanie między kodem a bibliotekami.Promise.all
tablicę przed zastosowaniem funkcji, zamiast tylko.then
obsługiwać niektóre biblioteki cukru. To nie jest obowiązkowe, ale jest urocze.return Promise.all(args).then(function(args){return fn.apply(this, args);})
spread
jest chwilową luką. ES6 wprowadza destrukturyzację i operatora spoczynku / rozproszenia, co eliminuje potrzebęspread
bezpośredniego..then(([a, b, c]) => {})
Możesz użyć destrukturyzacji E6:
Destrukturyzacja obiektów:
Destrukturyzacja macierzy:
źródło
Wartość spełnienia obietnicy jest analogiczna do wartości zwracanej funkcji, a przyczyna odrzucenia obietnicy jest analogiczna do rzuconego wyjątku funkcji. Funkcje nie mogą zwracać wielu wartości, więc obietnice nie mogą mieć więcej niż 1 wartość realizacji.
źródło
O ile wiem, czytając specyfikację ES6 Promise i standardową specyfikację obietnicy, nie ma klauzuli uniemożliwiającej implementacji obsługę tego przypadku - jednak nie jest ona zaimplementowana w następujących bibliotekach:
Zakładam, że powodem pomijania rozwiązań wieloskładnikowych jest sprawienie, aby zmiana kolejności była bardziej zwięzła (tj. Ponieważ można zwrócić tylko jedną wartość w funkcji, sprawiłoby to, że przepływ sterowania byłby mniej intuicyjny) Przykład:
źródło
return Promise.of(x, y)
zamiast wartości skalarnej zthen
wywołania zwrotnego.Oto rozwiązanie CoffeeScript.
Szukałem tego samego rozwiązania i znalazłem coś bardzo interesującego w tej odpowiedzi: Odrzucanie obietnic z wieloma argumentami (np. $ Http) w AngularJS
odpowiedź tego gościa Floriana
I aby z niego skorzystać:
źródło
->
być=>
?Świetne pytanie i świetna odpowiedź od Benjamina, Krisa i innych - wielkie dzięki!
Używam tego w projekcie i stworzyłem moduł oparty na kodzie Benjamina Gruenwalda . Jest dostępny na npmjs:
Następnie w swoim kodzie zrób
Jeśli używasz biblioteki, takiej jak
any-promise
Może inni też uznają to za przydatne!
źródło
Pomogłaby tutaj dezstrukturyzacja przypisania w ES6. Na przykład:
źródło
Ponieważ funkcje w Javascript można wywołać z dowolną liczbą argumentów, a dokument nie nakłada żadnych ograniczeń na
onFulfilled()
argumenty metody poza poniższą klauzulą, myślę, że można przekazać doonFulfilled()
metody wiele argumentów, o ile wartość obietnicy jest równa pierwszy argument.źródło
Aby zacytować poniższy artykuł, "" to "przyjmuje dwa argumenty, wywołanie zwrotne dla przypadku powodzenia i inny dla przypadku niepowodzenia. Oba są opcjonalne, więc możesz dodać wywołanie zwrotne tylko dla przypadku sukcesu lub niepowodzenia."
Zwykle zaglądam na tę stronę w poszukiwaniu podstawowych pytań dotyczących obietnic, daj mi znać, jeśli się mylę
http://www.html5rocks.com/en/tutorials/es6/promises/
źródło
new Promise
ma składnię,function(resolve, error)
podczas gdythen
ma składnię.then(function(arg) {
.then(function(/*resolve args*/){/*resolve handler*/}, function(/*reject args*/){/*reject handler*/})