我刚开始使用带有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,而不是使用回调来链接函数
答案 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
});
}