2016-04-29 12 views
2

Ich möchte einen Standard-Callback für HTTP-Anforderungen mit superagent erstellt werden. Die Aufrufe werden alle mit dem async.parallel() Framework durchgeführt und das Gesamtergebnis wird zusammen behandelt. Der Callback sollte die Ergebnisse der HTTP-Requests verarbeiten und bei Auftreten eines Fehlers einen Standardwert zurückgeben. Der Standardwert kann angegeben werden, aber null wird verwendet, wenn er nicht festgelegt wurde.Curry JavaScript-Funktion für fließend API

ich meine Handler mit einer fließenden Syntax wie folgt konstruieren will:

handle(done).withDefaultValue([]) (leeres Array als Standardwert festgelegt wird)

handle(done) (null als Standardwert verwendet wird)

I‘ Ich bin relativ neu im Currybetrieb. Hier ist, was ich versucht habe: ich einen Knoten Modul erstellt, die schließlich wie folgt verwendet werden sollen:

Mein Code in handle.js

module.exports = function(done){ 
    this.withDefaultValue = function(defaultValue){ 
    return function(err, result){ 
     if(err){ 
     debug('handling error ' + err + ' and returning default value ' + defaultValue) 
     return done(null, defaultValue) 
     } 
     // sanity check for null and empty objects 
     result = _.isEmpty(result)?[]:result 
     done(null, result) 
    } 
    } 
    return this 
} 

Mein Code in somefile.js

var handle = require('handle') 
async.parallel([ 
    function(done){ 
    api.myApiCall(arg1, arg2, handle(done).withDefaultValue([])) 
    }, 
    function(done){ 
    api.myOtherApiCall(arg1, arg2, handle(done)) 
    } 
], function(err, result){ 
}) 

obigen Code funktioniert für den ersten Anruf (der mit withDefaultValue([]), aber nicht für den zweiten Anruf:

Unhandled Error: handle(...).withDefaultValue is not a function

Was mache ich falsch?

+0

, wenn Sie sagen, es funktioniert für den zweiten Anruf aber nicht die erste, Sie meinen, dass die zweite Funktion in 'async.parallel' Werke , aber nicht die, die 'widthDefaultValue' verwendet? – andyk

+0

Sorry, ich habe das falsch geschrieben. Es funktioniert für den ersten Anruf (der mit 'withDefaultValue'), aber nicht für den zweiten Anruf. Das habe ich jetzt in der obigen Beschreibung korrigiert. – tiefenauer

+1

Das hat absolut nichts mit Curry zu tun. Meinen Sie den Begriff "Methodenverkettung"? – Bergi

Antwort

0

Dies scheint den Trick zu tun:

console.log = x => document.write(x + "<br>"); 
 

 

 

 
function handle(func) { 
 

 
    var handler = function(param) { 
 
     console.log('doing stuff...'); 
 
     func(param); 
 
    }; 
 

 
    var ret = handler.bind(this, "default"); 
 

 
    ret.withDefault = function(val) { 
 
     return handler.bind(this, val); 
 
    } 
 

 
    return ret; 
 
} 
 

 

 
function done(param) { 
 
    console.log(param) 
 
} 
 

 
setTimeout(handle(done)); 
 
setTimeout(handle(done).withDefault(123));

+0

dies curry scheint nicht so zu sein, wie ich es beschrieben habe (zumindest nicht genau). Wenn ich dich richtig verstehe, wird dein 'handle (func)' auf meine 'module.exports' abgebildet, wobei' param' meine 'done'-Funktion ist, der' handler' zur 'function (err, result)' in meinem Code . Dies scheint zu funktionieren, aber nur teilweise, weil ich nicht auf den err (der von superagenten gesetzt wird) zugreifen kann: module.exports = function (getan) { var handler = funktion (err, ergebnis) { zurück getan (err, result) } var ret = handler.bind (this, null, {}) ret.withDefaultValue = function (val) { return handler.bind (this, null, val) } return ret } – tiefenauer