Javascript-如何使用JavaScript回调进行阻止

时间:2018-11-05 03:59:22

标签: javascript node.js

这是我遇到的问题的简化版本。我希望能够创建一个调度程序类,以便它具有一个函数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)
}

2 个答案:

答案 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}}-任何特定的工作项目都可能以任何顺序完成。

一定要读asynchronous programming

简而言之:

  1. 您可以为将“异步”完成的某些工作项目返回Promises

  2. 您可以将诺言与Promise回调“链接”在一起,以确保一个工作项在上一个完成之前不会开始。

  3. 您还可以将承诺一起保存在一个数组中,并在它们全部完成后继续执行(无论哪个项目完成“第一”):Promise.then()

另外一个链接可能会有所帮助:

  

Promise.all

     

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