2014-05-24 21 views
5

Sto cercando di imparare utilizzando il comando differito e sono inciampato perché non ho previsto argomenti nel blocco "then".Come passare l'argomento alla funzione "then"

var makeCall = function (err, param) { 
    var deferred = Q.defer(); 
    setTimeout(function() { 
    console.log(1111, err, param); 
    deferred.resolve(err, param); 
    }, 1000); 
    return deferred.promise; 
}; 

makeCall('test', '11').then(function(err, data) { 
    console.log(222, err, data); 
}); 

Console. con 1111 uscite correggono i dati restituiti da una chiamata Ajax ma 222 no.

http://jsfiddle.net/M2V44/

+0

Qual è ' callEventSearch' e stai invocando 'makeCall'? – thefourtheye

+0

Buona chiamata, corretto – Anatoli

+0

Attualmente sto ricevendo sia '1111' che' 222' – thefourtheye

risposta

5

deferred.resolve può accettare un solo argomento e che è quello di segnare il successo della chiamata asincrona. Per notificare l'errore, è necessario utilizzare deferred.reject. Così il vostro codice deve essere cambiato come questo

var makeCall = function(err,param){ 
    setTimeout(function() { 
     console.log(1111, err, param); 
     var deferred = Q.defer(); 
     if (err) { 
      deferred.reject(err); 
     } else { 
      deferred.resolve(param); 
     } 
    }, 1000); 
    return deferred.promise; 
}; 

makeCall(undefined, '11').then(function (data) { 
    console.log(222, data); 
}, function (err) { 
    console.log(333, err); 
}); 

Questo stamperà 222 '11', per simulare il caso fallimento, basta richiamare makeCall con qualsiasi valore Truthy come il primo argomento, per esempio

makeCall('11').... 

lo farà richiamare il gestore degli errori e l'output sarà 333 '11'.

2

Nel tuo caso, eviterei del tutto la differita.

var makeCall = function(err,param){ 
    if(err) return Q.reject(err); 
    return Q(param).delay(1000); 
}; 

(fiddle)

L'utilizzo è simile risposta da prima di a thefoureye, dal momento che le promesse sono come il codice sincrono, si interagisce con loro utilizzando i valori di ritorno e le dichiarazioni di cattura. I Nodebacks ((err,data)) e le callback in genere rimuovono molte proprietà desiderabili dal codice asincrono e promettono di ripristinare tali proprietà.

makeCall(new Error("Hello"),"SomeValue").then(function(cata){ 
    console.log("Got correct data!",data); 
}).catch(function(err){ 
    console.log("Got error :(",err); // this would happen since we passed an error. 
}); 

Suppongo anche che questa funzione sia immaginaria e non rappresentativa di una vera API.

Si utilizzano principalmente oggetti posticipati quando si converte un'API in promesse, che in questo caso non è necessario.

1

Nota, a) Non è sicuro se interpretare la domanda correttamente; b) Promise non vengono implementate universalmente come in tutti i browser, né su jsfiddle. Questo può essere utile JavaScript promette http://www.html5rocks.com/en/tutorials/es6/promises/ (dove sotto pezzo può essere provato in console; dovrebbero anche lavorare con mozilla notte console, che sembrano implementare Promise oggetto)

Prova questo (modello)

var makeCall = function(err, param) {  
return new Promise(function(resolve, reject) { 
setTimeout(function() { 
    console.log(1111, err, param);  
    return (err && param) ? 
    resolve(err, param) : 
    reject(Error("error"))  
    }) 
    }, 1000); 
};   
makeCall("test", "11") 
.then(function(result) { 
console.log(222, result); 
makeCall("test2","11"); 
makeCall("abc", 123) // `chain` test 
}, 
function(err) { 
console.log(err) 
}); 
Problemi correlati