2016-09-23 4 views
1

У меня есть API (LoadFileApi.load) для файла загрузки, который вызывает обратный вызов при завершении. Существует общая логика (подготовка) и два разных способа обработки (запущены обработчиками кликов), которые запускаются при подготовке. Интересно, как сделать это понятным и удобным, JS способом?Лучший способ чередования действий после обратного вызова в JavaScript

function loadFile (onCompleteFileLoad) { 
    LoadFileApi.load({ 
     url: 'url', 
     onComplete: filePreparing 
    }); 
    } 

function fileProcessing1() { 

} 

function fileProcessing2() { 

} 

// common logic 
function filePreparing(file) { 
    // prepare 
    ... 
    // after prepare I need to run file processing routine corresponding to each handler 
} 

function clickHandlerA() { 
    loadFile(filePreparing); 

    // needs to trigger fileProcessing1 
} 

function clickHandlerB() { 
    loadFile(filePreparing); 

    // needs to trigger fileProcessing2 
} 

Простым решением является объявление общей переменной и установка ее в каждом обработчике перед загрузкой файла.

function filePreparing(file) { 
    // prepare 
    ... 
    if (processingMethod == 1) { 
     fileProcessing1(); 
    } else { 
     fileProcessing2(); 
    } 

} 

function clickHandlerA() { 
    processingMethod = 1; 
    loadFile(filePreparing); 

} 

function clickHandlerB() { 
    processingMethod = 2; 
    loadFile(filePreparing); 

} 

var processingMethod;

Но мне кажется, что более элегантный способ JS должен существовать ... Было бы здорово, если в PREPARE не будет установлен условный выбор функции обработки. Он должен быть передан в качестве параметра как-то ...

+0

Вы должны смотреть на ASync Lib http://caolan.github.io/async/ – hpfs

ответ

0

Я считаю, что вы хотите что-то похожее на ответ на этот вопрос - JavaScript: Passing parameters to a callback function

Используя шаблон, описанный в ответ на ссылку выше, вы увидите, что вы можете просто передавать параметры в ваш обратный вызов в общем случае.

что-то вроде:

function clickHandlerB() { 
    loadFile(filePreparing, fileProcessing1); 

} 

вместо того, чтобы передать флаг строку, чтобы указать, какие функции для вызова просто передать саму функцию. подпись Функция filePreparing в должны быть обновлены, чтобы включить функцию обратного вызова

function filePreparing(file, callback) 
+0

Проблема в том, что функция API является внешним один и имеет фиксированную подпись с одним параметром. Поэтому я вижу только thissolution https://jsfiddle.net/pn3xaLrb/ –