Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.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 在Meteor中管理异步回调_Javascript_Node.js_Asynchronous_Promise_Node Async - Fatal编程技术网

Javascript 在Meteor中管理异步回调

Javascript 在Meteor中管理异步回调,javascript,node.js,asynchronous,promise,node-async,Javascript,Node.js,Asynchronous,Promise,Node Async,我用的是流星1号和铁路由器1号 我在Meteor中的服务器端使用Node.js调用,在Meteor方法之外——特别是在服务器端Iron路由器路由内 到目前为止,路由内部的部分代码与以下代码类似: fs.mkdir(filebox, function (e) { if(!e || e.code === 'EEXIST') { fs.writeFile(file1, function (err) { if (err) throw err; f

我用的是流星1号和铁路由器1号

我在Meteor中的服务器端使用Node.js调用,在Meteor方法之外——特别是在服务器端Iron路由器路由内

到目前为止,路由内部的部分代码与以下代码类似:

  fs.mkdir(filebox, function (e) {
    if(!e || e.code === 'EEXIST') {
      fs.writeFile(file1, function (err) {
        if (err) throw err;

        fs.writeFile(file2, function (err) {
          if (err) throw err;

          fs.writeFile(file.3, function (err) {
            if (err) throw err;

            ExternalLibrary.do_something_(file1, function (err, buffer) {
              if (err) throw err;

              ExternalLibrary.do_something_(file2, function (err, buffer) {
                if (err) throw err;

                ExternalLibrary.do_something_(file3, function (err, buffer) {
                  if (err) throw err;

                  some_object = { first: file1, second: file2 }

                  ExternalLibrary.do_something_else_(some_object, function (err, buffer) {
                    if (err) throw err;

                    fs.readFile(file1, function (err, data) {
                      if (err) throw err;

                      res.write(data);
                      res.end();
                    });
                  });
                });
              });
            });
          });
        });
      });
    } else {
      console.log(e);
    }
  });
我的问题是,我需要添加更多对fs.write和ExternalLibrary的调用,并进一步使这些调用有条件

看来我要进地狱了

回拨 我知道Meteor使用协程(或纤维,或连续),但我不知道这是如何工作的。在Meteor方法中,我们可以选择使用Meteor.wrapAsync

我已经读了一些关于Node.js承诺和生成器的文章。具体来说,我正在试用frozeman/q-meteor库

问题: 什么是“压扁”这棵树并从地狱中拯救自己的最好方法?我想要一个解决方案,将允许条件方法调用了。例如,我最终需要在上面的代码示例中添加如下内容:

if (some_condition === true) {
  // call this method or node function
  fs.writeFile(file4, function (err) {
    fs.writeFile(file5, function (err) {
      // do something
    }
  }
}
else {
  // call this method or node function
  fs.writeFile(file6, function (err) {
    fs.writeFile(file7, function (err) {
      // do something
    }
  }
}

我最终用承诺来解决问题。我使用了Kris kriskowal的优秀Q库/Q。具体来说,这个流星包装是frozeman/q-Meteor

代码如下:

makeDirectory(filebox)
  .then(function () {
    console.log('in write file function');
    return writeFile(file1, data);
  })
  .then(function () {
    console.log('in write file function');
    return writeFile(file2, data);
  })
  .then(function () {
    console.log('in write file function');
    return writeFile(file3, data);
  })
  .then(function () {
    console.log('in external lib function');
    return ExternalLibrary._do_something(file1, data1, output1);
  })
  .then(function () {
    console.log('in external lib function');
    return ExternalLibrary._do_something(file2, data2, output2);
  })
  .then(function () {
    console.log('in external lib function');
    return ExternalLibrary._do_something(file3, data3, output3);
  })
  .then(function () {
    console.log('in concat function');
    return ExternalLibrary.cat(fileToCat, outputCat);
  })
  .then(function () {
    console.log('in read file function');
    return readFile(outputCat);
  })
  .then(function (result) {
    console.log('in the response function');
    res.write(result);
    res.end();
  })
  .catch(function (error) {
    console.log('darn error: ', error);
  })
  .done(function (result) {
    console.log('done');
  });
然后返回一个延迟承诺,其输出可用于前面的.then函数调用

帮助我入门的几个链接:


您有什么理由不同时完成所有这些工作?您从未使用任何以前的结果。对外部库的调用是异步的,对fs.write函数的调用也是异步的。由于创建的文件在外部库中使用,因此每个写函数都需要按顺序进行。我所做的示例并不完整,因为正如您所指出的,我没有使用承诺的回调值。。。我的实际代码确实使用了deferred.resolve(变量名称),而.then调用中的函数使用了这个变量。我可以用一个更完整的例子来说明这个例子。是的,请发布显示依赖关系的完整代码:-)