理解javascript中的setInterval

理解javascript中的setInterval,javascript,node.js,timer,Javascript,Node.js,Timer,我有一个函数,它可以做一些异步的事情,比如保存到数据库。需要一种机制,该机制首先插入行,下一次插入应仅在第一次插入操作完成时进行 这是我尝试过的,它有些效果 var区间=真 function insert() { model.save(function () { interval = true; }) } foreach(row, function (key, val) { var interval1 = setInterval(function () {

我有一个函数,它可以做一些异步的事情,比如保存到数据库。需要一种机制,该机制首先插入行,下一次插入应仅在第一次插入操作完成时进行

这是我尝试过的,它有些效果

var区间=真

function insert() {
    model.save(function () {
        interval = true;
    })
}
foreach(row, function (key, val) {
    var interval1 = setInterval(function () {
        if (interval) {
            insert();
            interval = false;
            clearInterval(interval1);
        }
    }, 100)
})

这是正确的做法吗?请解释一下我对javascript中计时器的理解。

我将使用一个处理异步内容的库,例如


顺便说一句,model.save方法似乎需要回调,您可以直接使用回调调用insert方法。如果insert函数是您自己创建的,而不是某个更大框架的一部分,我建议您重新编写它,并将回调作为参数,并在异步工作完成时使用它而不是使用setInterval进行检查。

我会使用一个处理异步内容的库,例如


顺便说一句,model.save方法似乎需要回调,您可以直接使用回调调用insert方法。如果insert函数是您自己创建的,而不是某个更大框架的一部分,我建议您重新编写它,并将回调作为参数,在异步工作完成时使用它而不是使用setInterval进行检查。

不,这绝对不是正确的方法。假设
包含10个值,然后创建10个连续运行的独立计时器,并检查它们是否可以插入。甚至不能保证它们是按创建顺序执行的

正如jfriend00已经提到的,您应该省略“循环”并使用save操作的完成回调。大概是这样的:

var rows = [...];

function insert(rows, index) {
    index = index || 0;
    var current_element = rows[index];

    model.save(function() {
        if (index < rows.length - 1) {
            insert(rows, index + 1);
        }
    });
}

insert(rows);
var行=[…];
函数插入(行、索引){
指数=指数| | 0;
var current_元素=行[索引];
model.save(函数(){
如果(索引

请注意,在保存操作完成后,函数如何(以某种方式)调用自身,增加索引以便“保存”数组中的下一个元素。

不,这绝对不是正确的方法。假设
包含10个值,然后创建10个连续运行的独立计时器,并检查它们是否可以插入。甚至不能保证它们是按创建顺序执行的

正如jfriend00已经提到的,您应该省略“循环”并使用save操作的完成回调。大概是这样的:

var rows = [...];

function insert(rows, index) {
    index = index || 0;
    var current_element = rows[index];

    model.save(function() {
        if (index < rows.length - 1) {
            insert(rows, index + 1);
        }
    });
}

insert(rows);
var行=[…];
函数插入(行、索引){
指数=指数| | 0;
var current_元素=行[索引];
model.save(函数(){
如果(索引

请注意,在保存操作完成后,函数如何(以某种方式)调用自身,增加索引以“保存”数组中的下一个元素。

否,您不应该创建计时器来轮询何时完成某项操作。这可能是你能做的最糟糕的方式了。您要做的是在前一个迭代每次完成时显式地开始下一个迭代

以下是如何在不进行投票的情况下实现这一点的总体思路。其思想是,您需要创建一个可以连续多次调用的函数,每次调用它时,它将执行下一次迭代。然后可以从异步操作的完成处理程序调用该函数。由于您没有一个方便的foreach循环来控制迭代,因此您必须找出需要跟踪哪些状态变量来指导每次迭代。如果您的数据是一个数组,那么您所需要的只是数组中的索引

function insertAll(rows) {

    // I'm assuming rows is an array of row items

    // index to keep track of where we are in the iteration
    var rowIndex = 0;

    function insert() {
        // keep going as long as we have more rows to process
        if (rowIndex < rows.length) {
            // get rows[rowIndex] data and do whatever you need to do with it

            // increment our rowIndex counter for the next iteration
            ++rowIndex;
            // save and when done, call the next insert
            model.save(insert)
        }
    }
    // start the first iteration
    insert();
}
函数插入全部(行){
//我假设行是行项目的数组
//索引以跟踪我们在迭代中的位置
var-rowIndex=0;
函数插入(){
//只要我们有更多行要处理,就继续
if(行索引<行长度){
//获取行[rowIndex]数据并对其执行任何需要的操作
//为下一次迭代增加行索引计数器
++行索引;
//保存,完成后调用下一次插入
model.save(插入)
}
}
//开始第一次迭代
插入();
}

如果您的数据不在一个数组中,而该数组很容易以这种方式一次遍历一个数组,那么您可以在需要时获取数据的下一次迭代(在没有更多数据时停止),或者可以在开始操作之前将所有数据收集到一个数组中并使用收集的数组。

否,您不应该创建计时器,以便在完成某项操作时进行轮询。这可能是你能做的最糟糕的方式了。您要做的是在前一个迭代每次完成时显式地开始下一个迭代

以下是如何在不进行投票的情况下实现这一点的总体思路。其思想是,您需要创建一个可以连续多次调用的函数,每次调用它时,它将执行下一次迭代。然后可以从异步操作的完成处理程序调用该函数。由于您没有一个方便的foreach循环来控制迭代,因此您必须找出需要跟踪哪些状态变量来指导每次迭代。如果您的数据是一个数组,那么您所需要的只是数组中的索引

function insertAll(rows) {

    // I'm assuming rows is an array of row items

    // index to keep track of where we are in the iteration
    var rowIndex = 0;

    function insert() {
        // keep going as long as we have more rows to process
        if (rowIndex < rows.length) {
            // get rows[rowIndex] data and do whatever you need to do with it

            // increment our rowIndex counter for the next iteration
            ++rowIndex;
            // save and when done, call the next insert
            model.save(insert)
        }
    }
    // start the first iteration
    insert();
}
函数插入全部(行){
//我假设行是行项目的数组
//索引以跟踪我们在迭代中的位置
var-rowIndex=0;
函数插入(){
//只要我们有更多行要处理,就继续
if(行索引<行长度){
//获取行[rowIndex]数据并对其执行任何需要的操作
//为下一次迭代增加行索引计数器
++罗温德