Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何确保Node.JS中循环期间的阻塞_Javascript_Node.js_Asynchronous_Npm_Synchronization - Fatal编程技术网

Javascript 如何确保Node.JS中循环期间的阻塞

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()

虽然我通常喜欢Node.JS回调汤,但我发现由于SQLite问题,代码的某些部分需要以阻塞方式运行。(是的,我知道我可以尝试解决SQLite部分,实际上,确保阻塞更有意义。)

我喜欢使用这个模块,虽然我觉得这个模块有一个可以在这里使用的特性,但我似乎找不到它。或者,也许有一个更好的模块。不管怎样,不用再麻烦了:

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的文件。我更希望不要在循环中的每个回调中异步进行这样的下载。