Javascript 用多个参数链接承诺

Javascript 用多个参数链接承诺,javascript,promise,Javascript,Promise,我刚刚开始在Javascript中使用Promissions,我想知道是否有办法减少在函数中包装每个然后回调的样板代码?我发现自己经常这样做,不知道是否有更好的方法 例如,在下面的mygetSettings函数中,它要么从数据库返回设置模型(然后),要么返回默认设置模型(catch) 我知道,如果then回调采用单个参数并返回一个值,则可以执行以下快捷方式: get('some_url').then(JSON.parse).then(function(response) { console.

我刚刚开始在Javascript中使用Promissions,我想知道是否有办法减少在函数中包装每个
然后
回调的样板代码?我发现自己经常这样做,不知道是否有更好的方法

例如,在下面的my
getSettings
函数中,它要么从数据库返回设置模型(
然后
),要么返回默认设置模型(
catch

我知道,如果then回调采用单个参数并返回一个值,则可以执行以下快捷方式:

get('some_url').then(JSON.parse).then(function(response) {
  console.log("response", response);
});
对于多个参数,有什么快捷方式可以使用吗?

使用并移动参数列表

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,可以在执行函数时将参数设置为参数列表的前缀。因此,在本例中,
id
mode
将在传递给
useModelFromData
useDefaultModel
的参数前面加上前缀,这就是我今天讨论的内容

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);
   }
}
这是我想到的页面…


…您可能会发现其他函数很有用。

spread在返回参数数组时有效-请参阅bluebird api for spread:这是一个好主意,但只有在这种情况下才有效,因为id和模式已经在范围内。如果findByInstance返回三个其他变量,则必须找到另一种方法。对于op发布的代码段,这是一个很好的解决方案。@rquinn:Promise只能将一个变量传递给下一个函数,尽管人们经常使用数组来解决这个问题。@Qantas94Heavy-是的,但是.spread有效地将多个变量传递给下一个函数。您必须返回一个数组,但是接受多个参数的函数的行为没有什么不同。是否也有一种方法可以使用curry来执行此操作,或者这样做没有意义?
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);
   }
}
var getSettings = function(instance, id, mode) {
    return findByInstance(instance)
        .then(p(useModelFromData, '{response}', id, mode))
        .catch(p(useDefaultModel, id, mode));
};