用于流畅API的Curried JavaScript函数

时间:2016-04-29 11:41:21

标签: javascript fluent currying

我想为使用superagent的HTTP请求编写默认回调。调用都是使用async.parallel()框架进行的,并且整体结果一起处理。如果发生错误,回调应处理HTTP请求的结果并返回默认值。可以指定默认值,但如果未设置,则使用null

我想使用这样的流畅语法构建我的处理程序:

handle(done).withDefaultValue([])(空数组设置为默认值)

handle(done)(null用作默认值)

我对于currying功能相对较新。这是我尝试过的: 我创建了一个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

我做错了什么?

1 个答案:

答案 0 :(得分: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));
&#13;
&#13;
&#13;