如何链接 q.nfcall 同步

How to chain q.nfcall syncronous

我读了一些教程,但我不明白如何链接各种承诺来读取文件,但一个接一个,我认为这很容易,但我不明白。

想法是打开一个文件,读取另一个文件的文件名,打开那个文件,然后启动 express 服务器。我得到了这样的东西,但我觉得我做的不是很好,它工作但我不喜欢它。

我的代码如下所示:

Q.nfcall(fs.readFile, path.resolve(__dirname, './config/db/default.connection.json'), "utf-8")
    .then(function(data){   ...
          /*HERE I OPEN OTHER 'Q' PROMISE FOR READ OTHER FILE AND START SERVER*/
             Q.nfcall(..). then(function(data2){ ... })
                   .catch(function(err){.. });
                  }). fail(function(err){...})
                    .done();
})
        .catch(function(err) {  ...});
})
       .fail(function(err) {..  })
        .done();

您可以通过从 .then() 处理程序返回新承诺来链接承诺,

Q.nfcall(fs.readFile, 'file1.txt').then(function(data1) {
  console.log('file 1 read');
  return Q.nfcall(fs.readFile, 'file2.txt'); // return a new promise
}).then(function(data2) {
  console.log('file 2 read');
}).catch(function(err) {
  ...
}).done();

Errors/exceptions 也将沿链传播。

编辑: 如果你想错误读取 file1.txt 不传播,而是以不同的方式处理(而不是创建文件),你可以使用像这样:

Q.nfcall(fs.readFile, 'test1.txt', 'utf-8').then(null, function(err) {
  // create an empty file (or whatever)
  return Q.nfcall(fs.writeFile, 'test1.txt', '').then(function() {
    return Q.nfcall(fs.readFile, 'test1.txt', 'utf-8');
  });
}).then(function(data) {
  console.log('data 1', data);
  return Q.nfcall(fs.readFile, 'test2.txt', 'utf-8');
}).then(function(data) {
  console.log('data 2', data);
}).catch(function(err) {
  ...
});

(也许可以做得更简洁)