将 PromiseJS 应用到这种情况

Apply PromiseJS to this situation

我刚刚开始使用 js 模块与节点、require 和 browserify 并尝试让代码工作,这最初是在一个脚本中。

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

所有需要 browserify 的部分似乎都有效,所以为了简单起见,我将省略所有 none 相关位。

在一个模块中我有这样的东西

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 会导致执行 api.getCurrentProcessInstanceTask 部分,但似乎永远不会调用 setupEmbeddedView。

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

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

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

每个运行异步代码块的函数都应该return一个承诺。

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

由于您使用的 jQuery.get() 是 return 的 jQuery 承诺,因此您必须让 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()returned promise。

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