我很难理解如何在node.js land中使代码异步。请看下面我的代码,分两种。
好的,这是我的第一次尝试-我有三个功能。处理函数(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);
        }
      });
    }
  });

最佳答案

以下是我的建议——在你的问题中,你说你需要在序列中运行三个函数——对吗?运行函数a,然后运行函数b,最后运行函数c。
最简单的方法是使用asyncjs库。
下面是一个例子:

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的输入才能运行。你是怎么做到的?使用async.waterfall
var async = require('async');

async.waterfall([
  function a(cb) {
    // do stuff
    cb(null, 'value');
  },
  function b(val, cb) {
    // do stuff with val
    cb(null, 'woot');
  },
  function c(val, cb) {
    // do stuff with val
    cb(null);
  },
], function() {
  // this will run once all three functions above have finished
});

不错吧?
希望这有帮助!
编辑:下面是一个代码块,显示了使用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!');
});

关于javascript - Node.js中的异步困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27991928/

10-13 07:02