Javascript 如何确保Node.JS中循环期间的阻塞
虽然我通常喜欢Node.JS回调汤,但我发现由于SQLite问题,代码的某些部分需要以阻塞方式运行。(是的,我知道我可以尝试解决SQLite部分,实际上,确保阻塞更有意义。) 我喜欢使用这个模块,虽然我觉得这个模块有一个可以在这里使用的特性,但我似乎找不到它。或者,也许有一个更好的模块。不管怎样,不用再麻烦了:Javascript 如何确保Node.JS中循环期间的阻塞,javascript,node.js,asynchronous,npm,synchronization,Javascript,Node.js,Asynchronous,Npm,Synchronization,虽然我通常喜欢Node.JS回调汤,但我发现由于SQLite问题,代码的某些部分需要以阻塞方式运行。(是的,我知道我可以尝试解决SQLite部分,实际上,确保阻塞更有意义。) 我喜欢使用这个模块,虽然我觉得这个模块有一个可以在这里使用的特性,但我似乎找不到它。或者,也许有一个更好的模块。不管怎样,不用再麻烦了: func = function(callback) { let i = 0; arr.forEach(val => { if (val.trim()
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
函数返回。我知道这需要重新编程handleResults
中的回调
,或者我需要围绕func
编写一个父函数,但我想看看StackOverflow的人是否有一些好主意
是的,我知道我可以尝试解决SQLite部分,实际上确保阻塞更有意义
不,没有,因为你不能。您需要解决它在异步时遇到的任何问题,因为无法将异步代码转换为同步代码。您可以将它转换为一个函数,在调用句柄结果时递归调用自己
您可以按照下面的示例进行操作
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之外,我忘了提到在此期间会下载100mb的文件。我更希望不要在循环中的每个回调中异步进行这样的下载。