2013-07-31 13 views
15

Mam problem z przekazaniem wszystkich argumentów. Moja oddzwoniona obietnica otrzymuje tylko jeden zamiast trzech:obietnica javascript nie przekazuje wszystkich argumentów (używając Q)

var asyncFunction= function(resolve) { 
    setTimeout(function() { 
     resolve("Some string that is passed", "and another", "third"); 
    }, 1000); 
}; 

var promiseFunction = function() { 
    var deferred = Q.defer(); 

    asyncFunction(deferred.resolve); 

    return deferred.promise; 
}; 

promiseFunction().then(function() { 
    // Only one argument is passed here instead of 3 
    // { '0': 'Some string that is passed' } 
    console.log(arguments); 
}); 

Każdy pomysł, co robię źle?

+0

moje pieniądze są na przymusie typowym –

Odpowiedz

12

Pięć obietnic może być resolve d tylko z jednym argumentem - obietnica oznacza jedną wartość, a nie ich kolekcję. Umieść je w tablicy jawnie, jeśli potrzebujesz wielu wartości. W przypadku wywołań zwrotnych z wieloma parametrami można użyć .spread().

+1

jak to możliwe? Istnieją tysiące bibliotek z funkcjami asynchronicznymi, które zwracają wiele argumentów? Czy nie mogą wtedy zostać użyte? – Nick

+0

Wydaje się, że tylko z otoką. Czy masz na myśli konkretny? – Bergi

+0

@Nick Cała biblioteka koncentruje się wokół podejścia z jedną wartością. [Spójrz na źródło] (https://github.com/kriskowal/q/blob/424dbd1f8c4a6a40a4b2c341598955b3880bfe79/q.js#L571) i spróbuj ustalić, jakie zmiany będą potrzebne do obsługi wielu wartości. Będziesz zaskoczony, jak bardzo to się komplikuje, podczas gdy nie zwracasz niewielkiej wartości. Użyj tablicy, jak sugeruje Bergi. – Tomalak

2

Funkcje synchroniczne zwracają tylko jedną wartość, w taki sam sposób, w jaki asynchroniczny powinien zostać rozwiązany.

Zła praktyka polega na tworzeniu funkcji asynchronicznych, które rozwiązują się z wieloma wartościami. Jeśli chcesz przekazać wiele wartości, zwróć je w tablicy lub obiekcie dict, tak samo jak byś zrobił, gdyby dana funkcja była synchroniczna.

+1

Wiele bibliotek używających wywołań zwrotnych przekazuje wiele argumentów; Nie uważam tej złej praktyki. Promises/Futures wspierające wiele wartości również wydaje się logicznym krokiem. Myślę, że należy to zbadać, podobnie jak to [wpis listy adresowej] (http: //lists.w3.org/Archives/Public/www-dom/2013AprJun/0059.html). – Matt

+0

Matt, początkowo w bibliotece twierdzę, że eksperymentowałem z tolerancją wielu wartości do rozwiązania, ale szybko odrzuciłem ten pomysł. Nie pamiętam teraz dokładnych problemów, ale wydaje mi się, że były przypadki, gdy potrzebowałem radzić sobie z rozdzielczością jako jednym obiektem, i było dziwne (a nie równorzędne z funkcjami synchronizacji), aby zawsze zajmować się obiektem tablicowym lub argumentów . Decyzja jest już ukształtowana i udowodniono, że ma rację w praktyce. Opublikowany przez Ciebie wpis został szybko odrzucony. Nie pamiętam, by taki pomysł był poważnie brany pod uwagę. –

+0

Bardzo mnie to obchodzi, ponieważ piszę bibliotekę obietnic (dla zabawy i nauki), a wiele rozstrzygających argumentów jest dla mnie naturalnym rozwiązaniem. Jeśli społeczność ustaliła jedną wartość, to przypuszczam, że tak. Dzięki za kontynuację. – Matt

0

Jeśli chcesz przekazać wiele wartości, musisz zawinąć je w inną przekazywaną wartość, na przykład tablicę lub obiekt.

Powiązane problemy