首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用nodejs编写异步程序?

如何用nodejs编写异步程序?
EN

Stack Overflow用户
提问于 2016-09-12 06:16:46
回答 1查看 51关注 0票数 1

例如,假设我想编写一个nodejs程序,其中我在不同的位置上有两个或三个独立的部分,如fs.readdir、fs.copy等,但是结果是所有三个操作都被发送到这样的json文件中:

代码语言:javascript
复制
var fs = require('fs-extra');

var jsd = {
    "act1" : false,
    "act2" : false,
    "act3" : false
}

fs.readdir(path1, function (err, files) {
    if (err)  jsd.act1 = err;
    for (x in files)  console.log(files[x]);
    jsd.act1 = true;
});

fs.copy(path2, path3, function (err) {
    if (err)  jsd.act2 = err;
    jsd.act2 = true;
});

fs.remove(path4, function (err) {
    if (err)  jsd.act3 = err;
    jsd.act3 = true;
});

// all three of the above actions are independent, so it makes sense that all of them are executed asynchronously.
// Now we write jsd object to a json file; jsd's contents are dependent on the above actions though

fs.writeJson("./data.json", jsd, function (err, files) {
    if (err)   return console.error(err);
});

如何确保将正确的数据输入文件data.json,即在执行之前的操作后执行fs.writeJson?

我知道一种方法是把它们全部筑巢,也就是说,

代码语言:javascript
复制
readdir() {
  copy() {
    remove() {
      writeJson();
    }
  }
}

但这可能会导致回调地狱,那么有更好的方法来做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-12 08:41:25

您可以使用允诺或模块异步,如果使用promise,首先必须将所有回调函数转换为如下所示的承诺:

代码语言:javascript
复制
const reddir = function(path) {
  return new Promise((resolve, reject) => {
    fs.readdir(path, (err, files) => {
      if (err) return reject(err);
      for (x in files)  console.log(files[x]);
      resolve(true);
    });
  })  
}

然后你可以用

代码语言:javascript
复制
Promise.all([reddir(path1), copy(path2, path3), remove(path4)])
  .spread((act1, act2, act3) => { //.spread is bluebird feature
    return writeJson(./data.json);
  })
  .catch(e => {
    // all error can handled in this
  })

如果您使用异步模块,您可以这样编写:

代码语言:javascript
复制
async.parallel({
  act1: function(cb){
    fs.reddir(path1, (err, files) => {
      if (err) return cb(err);
      for (x in files)  console.log(files[x]);
      cb(true);
    })
  },
  act2: ...
},(err, jsd) => { // jsd will be {act1: true, act2: ...}
  if (err) return console.error(err); // handle all above error here;
  fs.writeJson("./data.json", jsd, function (err, files) {
    if (err)   return console.error(err);
  });
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39444312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档