将 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
});
}
我刚刚开始使用 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
});
}