簡體   English   中英

鏈接承諾有多個參數

[英]Chaining promises with multiple arguments

我剛開始使用在Javascript中的承諾,我不知道是否有降低每個包裹的樣板代碼的方式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);
});

我可以為多個參數做任何捷徑嗎?

使用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的參數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);
   }
}

用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
...你可能會發現其他功能很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM