有许多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。
如何构造它,以便更高级别的调用者看不到相关的诺言?
谢谢
大卫
答案 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))