Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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 - Fatal编程技术网

Javascript node.js中的异步混淆

Javascript node.js中的异步混淆,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我很难理解如何在Node.js中使代码异步。请看下面我的代码,有两种 好的,这是我的第一次尝试-我在这里有三个函数。处理功能(iim)、文件复制功能(fse.copy)和归档功能(da) 我需要da在iim之后,iim在fse之后,收到 第一种方法导致归档发生,但它是空的,因为iim似乎从未发生过 da(randomString, function(err) { if (err) { log.error(err); } else { fse.copy(

我很难理解如何在Node.js中使代码异步。请看下面我的代码,有两种

好的,这是我的第一次尝试-我在这里有三个函数。处理功能(iim)、文件复制功能(fse.copy)和归档功能(da)

我需要da在iim之后,iim在fse之后,收到

第一种方法导致归档发生,但它是空的,因为iim似乎从未发生过

  da(randomString, function(err) {
    if (err) {
      log.error(err);
    } else {
      fse.copy(temp_path, new_location + file_name, function(err) {
        if (err) {
          log.error(err);
        } else {
          log.info("File saved to " + new_location + file_name);
          var sourceImage = new_location + file_name;
          log.debug(sourceImage);
          log.debug(randomString);

          iim(sourceImage, randomString, function(err) {
            if (err) {
              log.error(err);
            }
          });
        }
      });
    }
  });
下一块是另一种方法,它导致在iim完成之前发生da

  fse.copy(temp_path, new_location + file_name, function(err) {
    if (err) {
      log.error(err);
    } else {
      log.info("File saved to " + new_location + file_name);
      var sourceImage = new_location + file_name;
      log.debug(sourceImage);
      log.debug(randomString);

      iim(sourceImage, randomString, function(err) {
        if (err) {
          log.error(err);
        }
      });
      da(randomString, function(err) {
        if (err) {
          log.error(err);
        }
      });
    }
  });

因此,您可以将第二个示例中的da放入iim的回调(现在不是):

fse.copy(temp_path, new_location + file_name, function(err) {
    if (err) {
      log.error(err);
    } else {
      log.info("File saved to " + new_location + file_name);
      var sourceImage = new_location + file_name;
      log.debug(sourceImage);
      log.debug(randomString);

      iim(sourceImage, randomString, function(err) {
        if (err) {
          log.error(err);
          return;
        }
        da(randomString, function(err) {
          if (err) {
            log.error(err);
          }
        });

      });
    }
  });

也就是说,回调深度可以通过使用async()之类的库来实现平坦化。我建议您这样做——在您的问题中,您说您基本上需要串联运行三个函数——对吗?运行函数A,然后运行函数B,最后运行函数C

最简单的方法是使用库

下面是一个例子:

var async = require('async');

async.series([
  function a(cb) {
    // do stuff
    cb();
  },
  function b(cb) {
    // do stuff
    cb();
  },
  function c(cb) {
    // do stuff
    cb();
  },
], function() {
  // this will run once all three functions above have finished
});
现在,假设这些函数中的每一个都需要将数据返回到下一个函数。假设函数B需要函数A的输入才能运行。你是如何做到的?使用

不错吧

希望这有帮助

编辑:下面是一个代码块,显示了上面使用asyncjs重构的代码:

async.waterfall([
  function(cb) {
    fse.copy(temp_path, new_location + file_name, function(err) {
      if (err) {
        log.error(err);
      } else {
        log.info("File saved to " + new_location + file_name);
        var sourceImage = new_location + file_name;
        log.debug(sourceImage);
        log.debug(randomString);
      }
      console.log('Finished running fs.copy');
      cb(null, sourceImage, randomString);
    });
  },
  function(sourceImage, randomString, cb) {
    iim(sourceImage, randomString, function(err) {
      if (err) {
        log.error(err);
      }
      console.log('Finished running iim');
      cb(null, randomString);
    });
  },
  function(randomString, cb) {
    da(randomString, function(err) {
      if (err) {
        log.error(err);
      }
      console.log('Finished running da');
      cb();
    });
  }
], function() {
  console.log('All done!');
});

你说你想要
fse.copy
<代码>iim<代码>da。为什么在第一个示例中首先调用
da
?如果
是空的,它意味着什么?请说出你的函数名称。@akonsu,我想,太多的困惑和太长时间的盯着这个问题!很抱歉你对fse有什么建议吗。。。我。。。请问da序列?@Amberlamps,对不起。da是一个存档功能,它可以压缩目录。此目录由图像处理(iim)填充。在您提到的示例中,存档函数发生在图像处理函数完成之前,导致存档不完整。我需要所有这些都是异步的。回调深度也可以轻松自然地展平,方法是使用每个模块“展平”写下的命名函数,而不是更深入的内联。结合模块化方法和定义良好的接口,JS没有“回调地狱”。没有人需要一个完整的库来在一个支持闭包的环境中编写非嵌套异步……谢谢@Paul,我确实尝试了你的建议,但这导致da()无法运行,没有错误。我进一步感到困惑,因为这就是它“应该”的工作方式?这实际上非常有用,谢谢@rdeges.:-)我很难将这等同于我的实际代码,因为函数不是那么简单。你愿意帮我处理我的实际代码块吗?嘿@davidjpockok。刚刚在底部添加了一个完全重构的代码示例=)Good great@rdeges!非常感谢你。这种事情太神奇了。你太棒了。:-)我有更多的问题,这一定意味着我的模块无法正常工作。我将编辑上面的put输出,基本上是
console.log('Finished running iim')
console.log('Finished running da')未运行;这可能意味着这些功能不能正常工作。嘿!我刚刚看到了你的编辑(没有批准,因为它可能会让其他SO读者感到困惑),但是是的。这些功能不能正常工作。我要做的是:打开一个关于单独修复这些模块(包括它们的代码)的新问题,然后在注释中从这里链接到它=)
async.waterfall([
  function(cb) {
    fse.copy(temp_path, new_location + file_name, function(err) {
      if (err) {
        log.error(err);
      } else {
        log.info("File saved to " + new_location + file_name);
        var sourceImage = new_location + file_name;
        log.debug(sourceImage);
        log.debug(randomString);
      }
      console.log('Finished running fs.copy');
      cb(null, sourceImage, randomString);
    });
  },
  function(sourceImage, randomString, cb) {
    iim(sourceImage, randomString, function(err) {
      if (err) {
        log.error(err);
      }
      console.log('Finished running iim');
      cb(null, randomString);
    });
  },
  function(randomString, cb) {
    da(randomString, function(err) {
      if (err) {
        log.error(err);
      }
      console.log('Finished running da');
      cb();
    });
  }
], function() {
  console.log('All done!');
});