如何链接q.nfcall同步

时间:2015-06-23 12:05:36

标签: javascript promise q

我阅读了一些教程,但我不明白如何将各种承诺链接到读取文件但是一个接一个,我觉得它很容易,但我不明白。

想法是打开一个文件,读取另一个文件的文件名,打开该文件然后启动快速服务器。我有类似的东西,但我认为我的确不是很好,它的工作,但我不喜欢它。

我的代码如下所示:

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();

1 个答案:

答案 0 :(得分:2)

您可以通过从.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();

错误/异常也将沿着链传播。

编辑:如果您希望错误阅读file1.txt不传播,而是以不同方式处理(改为创建文件),您可以使用以下内容:< / p>

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) {
  ...
});

(可能更简洁)