2013-07-31 18 views
15

Ho problemi a passare tutti gli argomenti. Il mio callback di promessa riceve solo uno anziché tre:javascript promette di non passare tutti gli argomenti (usando 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); 
}); 

Qualche idea di cosa sto facendo male?

+0

il mio denaro è di tipo coercitivo –

risposta

12

Q promesse possono essere resolve d con un solo argomento - una promessa sta per un singolo valore, non per una raccolta di essi. Inseriscili in un array in modo esplicito se hai bisogno di più valori. Per i callback con parametri multipli, è possibile utilizzare .spread().

+1

come è possibile? Ci sono migliaia di librerie con funzioni asincrone là fuori che restituiscono più argomenti? Non possono essere usati allora? – Nick

+0

Sembra solo con un wrapper. Hai in mente un particolare? – Bergi

+0

@Nick L'intera libreria è incentrata sull'approccio a valore singolo. [Guarda la fonte] (https://github.com/kriskowal/q/blob/424dbd1f8c4a6a40a4b2c341598955b3880bfe79/q.js#L571) e prova a capire quali modifiche sarebbero necessarie per supportare più valori. Rimarrai sorpreso di quanto sia complesso questo mentre restituisci poco o nessun valore reale. Usa un array, come suggerisce Bergi. – Tomalak

2

Le funzioni sincrone restituiscono un solo valore, allo stesso modo in cui asincrono deve risolversi con uno.

È una cattiva pratica creare funzioni asincrone che risolvono con molti valori. Se vuoi passare molti valori, restituiscili nell'array o nell'oggetto dict, come faresti se la funzione data fosse sincrona.

+1

Un sacco di librerie che usano i callback restituiscono più argomenti; Non considero questa cattiva pratica. Promesse/Futures che supportano più valori sembra anche un passo logico. Penso che questo dovrebbe essere esplorato, così come questa [voce della mailing list] (http: //lists.w3.org/Archives/Public/www-dom/2013AprJun/0059.html). – Matt

+0

Matt, inizialmente in biblioteca, sostengo che ho sperimentato la possibilità di più valori per la risoluzione, ma ho rapidamente respinto quell'idea. Non ricordo ora i problemi esatti, ma credo che ci fossero casi in cui avevo bisogno di trattare il valore risolto come un oggetto, ed era strano (e non alla pari con le funzioni di sincronizzazione) trattare sempre con un oggetto array o argomenti . La decisione è già stata coniata e dimostrata corretta nella pratica. Il post che hai collegato come vedi è stato rapidamente messo giù. Non ricordo che una tale idea sia stata seriamente presa in considerazione. –

+0

Mi interessa solo perché sto scrivendo una libreria di promesse (per divertimento e apprendimento) e più argomenti di risoluzione mi sembrano una soluzione così naturale. Se la comunità si è fissata su un singolo valore, suppongo. Grazie per il follow-up. – Matt

0

Se si desidera passare più valori, è necessario racchiuderli in un altro valore che si passa, ad esempio un array o un oggetto.

Problemi correlati