2015-11-25 2 views
0

Я только что начал использовать js-модули с узлом, потребовать и прорежировать и пытаться заставить код работать, который изначально был в одном скрипте.Применить PromiseJS к этой ситуации

Я также хотел бы начать использовать promjs, но не уверен, как применить его в этой ситуации.

Все требуемые части браузера, похоже, работают, поэтому я просто оставлю все неиспользуемые биты для простоты.

В одном модуле у меня есть что-то вроде этого

module.exports.api = function(){ 

var getCurrentProcessInstanceTask = function getCurrentProcessInstanceTask(options) { 
     if (!currentProcess || !currentProcess.id) { 
     throw new Error("no currentProcess is set, cannot get active task"); 
     return; 
     } 
     var processInstanceId = currentProcess.id; 

     jQuery.get(hostUrl + "service/runtime/tasks", { 
      processInstanceId: processInstanceId 
     }) 
     .done(function(data) { 
      console.log("response: " + JSON.stringify(data, null, 2)); 
      currentProcess.tasks = data.data; 

      if (options && options.callback) { 
       options.callback(data.data); 
      } 
     }); 
    } 

return { 
getCurrentProcessInstanceTask: getCurrentProcessInstanceTask 
} 

} 

Тогда в другом модуле у меня есть что-то вроде этого

var Api = require('./api'); 

    module.exports.view = function(){ 

    var api = Api(); 

    var setupEmbeddedView = function setupEmbeddedView(url, tmpl) { 
      tmpls.renderExtTemplate({ 
      name: tmpl, 
      selector: targetDiv, 
      data: { 
      url: url, 
      width: iframeTargetDiv.width(), 
      height: iframeTargetDiv.height() 
      }, 
      callback: function() { 
       jQuery('#taskFormFrame').load(function(e) { 
       console.log("taskFormFrame load fired!"); 

       }); 

      } 
      }); 
     }, 
    showCurrentTaskForm = function showCurrentTaskForm() { 
      console.log("mark"); 
      api.getCurrentProcessInstanceTask({ 
      callback: function(tasks) { 
       setupEmbeddedView(getTaskFormUrl(tasks), 'showTaskForm'); 
      } 
      }); 
     } 

    return { 
    showCurrentTaskForm: showCurrentTaskForm 

    } 

    } 

вызывающего showCurrentTaskForm в другом модуле, где представление необходимых результатов в апи .getCurrentProcessInstanceTask выполняется, но setupEmbeddedView никогда не вызывает вызов.

Я очень смущен, почему, может быть, кто-то может объяснить.

Также я хотел бы пример того, как я бы применить promisejs в данном конкретном случае, вместо того чтобы использовать обратные вызовы функций цепи

ответ

0

Текущая версия JQuery не выполняет Обещания/A + спецификации. Я бы рекомендовал использовать отдельную библиотеку обещаний, такую ​​как bluebird.

Каждая функция, выполняющая асинхронный блок кода, должна возвращать обещание.

Рассматривая ваш код, getCurrentProcessInstanceTask и, следовательно, он должен вернуть обещание.

Поскольку вы используете jQuery.get(), который возвращает обещание jQuery, вам нужно будет позволить сибирской ассимиляции, обещающей создать правильную цепочку обещаний.

var getCurrentProcessInstanceTask = function getCurrentProcessInstanceTask() { 

    if (!currentProcess || !currentProcess.id) { 
     return Promise.reject(new Error("no currentProcess is set, cannot get active task")) 
    } 

    var processInstanceId = currentProcess.id; 

    return Promise.resolve(jQuery.get(hostUrl + "service/runtime/tasks", {processInstanceId: processInstanceId}) 
     .then(function(data){ 
     console.log("response: " + JSON.stringify(data, null, 2)); 
     currentProcess.tasks = data.data; 
     return data.data; 
     }); 
    ); 
} 

Чтобы запустить его последовательно, просто изменить функцию showCurrentTaskForm вызвать функцию апи и .then() возвращаемого обещание.

showCurrentTaskForm = function showCurrentTaskForm() { 
    console.log("mark"); 
    api.getCurrentProcessInstanceTask() 
     .then(function(result){ 
     setupEmbeddedView(result, 'showTaskForm'); 
     }) 
     .catch(function(e){ 
     //handle the error 
     }); 
} 
Смежные вопросы