将PromiseJS应用于这种情况

时间:2015-11-25 12:53:19

标签: javascript promise browserify

我刚开始使用带有node,require和browserify的js模块,并尝试使代码工作,这最初只在一个脚本中。

我也想开始使用promisejs,但我不确定如何在这种情况下应用它。

所有需要的浏览器部件似乎都有效,所以为了简单起见,我将把所有相关的部分都留下来。

在一个模块中,我有类似的东西

db.py

然后在另一个模块中,我有类似的东西

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
}

}

在另一个需要视图的模块中调用showCurrentTaskForm会导致api.getCurrentProcessInstanceTask部分被执行,但似乎似乎没有调用setupEmbeddedView。

我很困惑为什么有人可以解释。

此外,我想要一个例子,说明如何在这种特殊情况下应用promisejs,而不是使用回调来链接函数

1 个答案:

答案 0 :(得分:0)

当前版本的jQuery不符合Promises / A +规范。我建议使用单独的promise库,例如bluebird

运行异步代码块的每个函数都应该返回一个promise。

查看您的代码,getCurrentProcessInstanceTask因此它应该返回一个承诺。

由于您正在使用返回jQuery承诺的jQuery.get(),因此您必须让bluebird同化承诺以创建正确的承诺链。

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函数以调用api函数并.then()返回的promise。

showCurrentTaskForm = function showCurrentTaskForm() {
    console.log("mark");
    api.getCurrentProcessInstanceTask()
      .then(function(result){
        setupEmbeddedView(result, 'showTaskForm');
      })
      .catch(function(e){
        //handle the error
      });
}