如何确保在Node.JS的一个循环中阻塞

虽然我通常喜欢Node.JS的callback函数,但是我发现由于SQLite问题,我的代码的某个部分需要以阻塞的方式运行。 (是的,我知道我可以尝试和解决SQLite的一部分,它确实是更有意义,以确保阻止。)

我喜欢使用asynchronous模块,虽然我有一种感觉,模块有一个可以在这里使用的function,我似乎无法find它。 或者,也许有一个更好的模块。 无论如何,毫不犹豫:

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人有一些好主意。

可以把它变成一个函数,当handleResults callback命中时recursion调用自己。

你可以通过下面的例子来做到这一点。

 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:我假设你只需要在这个方法和其中的循环同步。 在运行时,其他代码可能仍然在其他应用程序中运行。

是的,我知道我可以尝试和解决SQLite的一部分,它确实是更有意义,以确保阻止。

不,不,因为你不能。 您需要解决与asynchronous代码相关的任何问题,因为无法将asynchronous代码转换为同步代码。