链接承诺有多个参数

时间:2014-11-02 01:30:24

标签: javascript promise

我刚刚开始在Javascript中使用promises,我想知道是否有办法减少函数中包含每个then回调的样板代码?我发现自己做了很多,并想知道是否有更好的方法

例如,在我的getSettings函数中,它会从数据库(then)或默认设置模型(catch)返回设置模型。

var getSettings = function(instance, id, mode) {
    return findByInstance(instance)
        .then(function(data) {
            return useModelFromData(data, id, mode);
        })
        .catch(function() {
            return useDefaultModel(id, mode)
        });
};

var useModelFromData = function(data, id, mode) {
    var settings = data.model.settings;
    applyFeatures(settings, id, mode);
    return data.model;
};

var useDefaultModel = function(id, mode) {
    var model = myModel.getDefaultModel();
    applyFeatures(model.settings, id, mode);
    return model;
};

我知道如果当时的回调接受一个参数并返回一个值,你可以执行以下快捷方式:

get('some_url').then(JSON.parse).then(function(response) {
  console.log("response", response);
});

我可以为多个参数做任何快捷方式吗?

2 个答案:

答案 0 :(得分:7)

使用bind并移动参数列表

var getSettings = function(instance, id, mode) {
    return findByInstance(instance)
        .then(useModelFromData.bind(null, id, mode))
        .catch(useDefaultModel.bind(null, id, mode));
};

var useModelFromData = function(id, mode, data) {
    var settings = data.model.settings;
    applyFeatures(settings, id, mode);
    return data.model;
};

var useDefaultModel = function(id, mode) {
    var model = myModel.getDefaultModel();
    applyFeatures(model.settings, id, mode);
    return model;
};

使用bind,您可以在执行函数时将参数设置为参数列表的前缀。因此,在这种情况下,idmode将被添加到传递给useModelFromDatauseDefaultModel

的参数之前

答案 1 :(得分:0)

我今天经历过这个,这就是我想出的......

function p(func){
  var args=[];
  for(var i=1,end=arguments.length;i<end;i++)args.push(arguments[i]);
   return function(response){
     for(var i=0,end=args.length;i<end;i++){
       if(args[i]=='{response}')args[i]=response;
     }
    return func.apply(func,args);
   }
}

使用p你不需要改变你的召唤函数的参数,你可能刚刚完成....

var getSettings = function(instance, id, mode) {
    return findByInstance(instance)
        .then(p(useModelFromData, '{response}', id, mode))
        .catch(p(useDefaultModel, id, mode));
};

这是我提出来的页面...... http://plnkr.co/edit/4EGDTk?p=preview
......你可能会发现其他功能很有用。