这是我遇到的问题的简化版本。我希望能够创建一个调度程序类,以便它具有一个函数addTask(),该函数将任务函数作为参数。该类还具有一个begin函数runSchedule(),该函数可以同步或按顺序运行任意数量的添加任务。我认为也许我可以用一系列Promises来做类似的事情,但是我以前从未使用过Promises,但是研究和尝试使用Promises并不能使我产生任何效果。
是否可以将函数参数存储到addTask(),然后在调用runSchedule()的过程中依次调用所有已添加的任务?如果任务成功运行,则调用成功回调。如果一项任务失败,则停止并不再执行其他任务,然后调用错误回调。
class Schedule {
constructor( ) {
this.tasks = []
}
addTask( task ) {
this.tasks.push( task )
// added to list of promises here
// currently just adding function to an array
}
runSchedule( success, error ) {
try {
// run the tasks here
success()
} catch (e) {
error()
}
}
}
s = new Schedule()
// first
s.addTask( function(goToNext, stopRunning) {
this.value1 = true
goToNext();
});
// second
s.addTask( function(goToNext, stopRunning) {
if (!this.value1) {
stopRunning();
}
var self = this
setTimeout(function() {
self.value2 = true
goToNext();
}, 1000);
});
// run first task, then second task
s.runSchedule(function () {
console.log(this.value1)
console.log(this.value2)
}, function (error) {
console.log("error: " + error)
}
答案 0 :(得分:0)
class Schedule {
constructor( ) {
this.tasks = []
}
addTask( task ) {
this.tasks.push( task )
// added to list of promises here
// currently just adding function to an array
}
runSchedule( success, error ) {
try {
run(this.tasks.pop());// use tasks.shift() if you want to go from begining
} catch (e) {
error()
}
}
run(task){
task()
.then(()=>{
if(this.tasks>0){
run(this.tasks.pop())
}
else{
success()
}
})
.catch(()=>{
//call your failure here
})
}
}
应该像这样添加任务
s.addTask(function(){
return new Promise((success, failure)=>{
//do your work at the end call success() or failure()
});
});
添加了一个新方法run,它以task
作为参数,如果执行成功则执行,然后递归地调用run,直到所有任务都完成为止,而不是调用success();如果存在错误,则处理你的失败
我们必须更改任务,每个任务都返回诺言,如果成功调用success()
否则failure()
注意:无法测试,请写电话,请检查错字
答案 1 :(得分:0)
强烈建议:在某种程度上,它可能会让您想到“线程”(其他语言),请考虑从词汇表中清除“任务”一词。使用Javascript,最好不要考虑{ {3}}-任何特定的工作项目都可能以任何顺序完成。
简而言之:
您可以为将“异步”完成的某些工作项目返回Promises。
您可以将诺言与Promise回调“链接”在一起,以确保一个工作项在上一个完成之前不会开始。
您还可以将承诺一起保存在一个数组中,并在它们全部完成后继续执行(无论哪个项目完成“第一”):Promise.then()。
另外一个链接可能会有所帮助:
JavaScript的承诺并不困难。但是,很多人发现它 一开始有点难以理解。因此,我会 喜欢以一种虚构的方式写下我理解诺言的方式。
1. Understanding Promises 2. Creating a Promise 3. Consuming Promises 4. Chaining Promises 5. Promises are Asynchronous 6. Promises in ES5, ES6/2015, ES7/Next 7. Why Promises and When to Use Them? 8. New Kid On the Block: Observables 9. Summary