如何封装I / O和类似的承诺

时间:2018-12-05 03:47:42

标签: javascript node.js ecmascript-6 promise es6-promise

有许多I / O操作(对其他服务器的请求,数据库访问,文件访问)都是或应有的承诺。但是,对于封装,可能会发出更高级别的调用,例如服务器请求(例如Google recapcha或Cloudinary),数据库调用(例如PostgreSQL,Mongo,ReDis)或仅读取文件。

理想情况下,这些格式应为:

functionCall()
.then(FC1)
.then(FC2)
.catch()

主调用方不必知道调用的内部信息,也不必随后调用或catch子句。据我了解,它们应该类似于:

highLevelFuncionCall()
.then(()=>{
   functionCall() //and all its then/catch clauses
}
.then(HLFC1)
.then(HLFC2)
.catch()

但是,它似乎无法正常工作。即使首先需要对它们进行处理,处理也将继续到HLFC1,而无需等待FC1和FC2。

如何构造它,以便更高级别的调用者看不到相关的诺言?

谢谢

大卫

1 个答案:

答案 0 :(得分:0)

如果我正确理解(基于评论),这应该可以模拟所描述的场景:

function getResolved() {
  return new Promise((resolve) => window.setTimeout(resolve, 500, 'ok'));
}

function getRejected() {
  return new Promise((resolve, reject) => window.setTimeout(reject, 500, 'error!'));
}

function progressChain(functionCall) {
  return getResolved() // HLF1
  .then(() => {
    return functionCall() // functionCall with then/catch
    .then(getResolved)
    .then(() => console.log('functionCall resolved'))
    .catch((err) => { // FCC
      console.log('Argh!! functionCall failed!');
      throw err; // rethrow err to chain
    });
  })
  .then(getResolved) // HLF2
  .then((res) => console.log(res)) // HLF3
  .catch((err) => console.log(err)); // HLC
}

// both resolved and rejected scenario (synced)
progressChain(getResolved)
.then(() => progressChain(getRejected))