2016-04-29 8 views
2

Я хочу написать обратный вызов по умолчанию для HTTP-запросов, сделанных с помощью superagent. Все вызовы выполнены с помощью рамки async.parallel() и общий результат обрабатывается вместе. Обратный вызов должен обрабатывать результаты HTTP-запросов и возвращать значение по умолчанию, если произошла ошибка. Значение по умолчанию может быть указано, но null будет использоваться, если он не был установлен.Curried JavaScript-функция для свободного API

Я хочу построить свой обработчик, используя свободно синтаксис вроде этого:

handle(done).withDefaultValue([]) (пустой массив устанавливается как значение по умолчанию)

handle(done) (нуль используется в качестве значения по умолчанию)

Я м относительно новый для работы карри. Вот что я пытался: я создал модуль Node, который должен быть в конечном счете используется следующим образом:

Мой код в 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 
} 

Мой код в 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){ 
}) 

Над кодом работ для первого вызова (один с withDefaultValue([]), но не для второго вызова:

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

Что я делаю неправильно?

+0

, когда вы говорите, что он работает для второго вызова, но не первый, вы имеете в виду, что вторая функция 'async.parallel' работ , но не тот, который использует 'widthDefaultValue'? – andyk

+0

Извините, я написал это неправильно. Он работает для первого вызова (один с 'withDefaultValue'), но не для второго вызова. Я исправил это в описании выше. – tiefenauer

+1

Это не имеет никакого отношения к карри. Вы имели в виду использовать термин «цепочка методов»? – Bergi

ответ

0

Это, кажется, сделать трюк:

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

не похоже на то, что я описал (по крайней мере, не совсем). Если вы правильно поняли, ваш 'handle (func)' сопоставляется с моим 'module.exports' с параметром' param', который является моей 'done' -функцией,' обработчик' 'функции (err, result)' в моем коде , Это, похоже, работает, но только частично, потому что я не могу получить доступ к ошибке (которая задана суперагентом): module.exports = function (done) { var handler = function (err, result) { return done (ERR, результат) } вар RET = handler.bind (это, нулевой, {}) ret.withDefaultValue = функция (Val) { возврата handler.bind (это, нулевой, вал) } возврата ret } – tiefenauer