2016-07-31 3 views
1

Хотя я обычно пользуюсь супом обратного вызова, который является Node.JS, я обнаружил, что определенную часть моего кода нужно запускать блокирующим образом из-за проблемы с SQLite , (Да, я знаю, что могу попытаться обратиться к части SQLite, на самом деле имеет смысл обеспечить блокировку.)Как обеспечить блокировку во время цикла в Node.JS

Мне нравится использовать модуль async, и хотя у меня есть ощущение, что у модуля есть функция, которая может быть использована здесь я не могу найти его. Или, может быть, там есть лучший модуль. Во всяком случае, не мудрствуя лукаво:

func = function(callback) { 
    let i = 0; 
    arr.forEach(val => { 
     if (val.trim().length > 0) { 
      console.log(`Starting for user ${val}.`); 
      let mylc = new lcapp(val); 
      ////// TODO this needs to be made sycnronous. ///// 
      async.series({ 
       getMyDetails: callback => getMyDetails(mylc, callback) 
      }, (err, results) => handleResults(err, results, mylc, callback)); 
      ///////////// 
     } 
    }); 
}; 

фрагмент кода в окружении //// Я хотел бы, чтобы блокировать до handleResults функция возвращает. Я понимаю, что это потребует перепрограммирования callback в handleResults, или, может быть, мне нужно написать родительскую функцию около func, но я бы хотел, чтобы у StackOverflow были хорошие идеи.

ответ

0

Да, я знаю, что могу попытаться обратиться к части SQLite, на самом деле имеет смысл обеспечить блокировку.

Нет, это не так, потому что вы не можете. Вам нужно решить любую проблему, с которой вы работаете, асинхронно, потому что нет способа превратить асинхронный код в синхронный код.

+0

Помимо SQLite, я забыл упомянуть, что при загрузке файла размером 100 Мб продолжается. Я бы предпочел не скачивать, как это происходит асинхронно через каждый обратный вызов в цикле. –

1

Вы могли превратить его в функцию, которая рекурсивно вызывает себя, когда handleResultscallback ударил.

Вы можете сделать это, выполнив приведенный ниже пример.

fun() 

function fun() { 
    console.time("fun") 
    var arr = [1, 2, 3, 4, 5] 
    var i = arr.length - 1; 
    doStuff(doStuffCallback) 

    function doStuffCallback() { 
    if (i > 0) { 
     i-- 
     doStuff(doStuffCallback) 
    } else { 
     console.timeEnd("fun") 
    } 
    } 

    function doStuff(callback) { 
    setTimeout(function() { 
     logIt() 
     callback() 
    }, 25) 
    } 

    function logIt() { 
    console.log(arr[i]) 
    } 
} 

// Output: 
// 5 
// 4 
// 3 
// 2 
// 1 
// fun: about 160ms 

PS: Я предполагаю, что вам нужно только быть синхронным в этом методе и петле в нем. В то же время другой код может работать в другом месте приложения.

Смежные вопросы