[英]TypeScript and Promise wrapper with Async/Await. How do I tie in legacy code?
我試圖通過返回一個新的Promise,添加一個try catch和一個供用戶編寫代碼的回調來創建一個包裝了promise的JavaScript /打字稿函數。 這是概念:
function XPromise(code) {
return new Promise((resolve, reject) => {
try {
resolve(code());
} catch (exception) {
reject(exception);
}
});
}
但是我將如何使用上面的代碼段來實現以下目的:
async function GetData(testClient, project, testPlan, suiteId) {
return XPromise(code => {
console.debug("GetData");
testClient.getData(project, testPlan, suiteId)
.then(data => {
if (data.length === 0) reject(data);
resolve(data);
});
}
遺留代碼使用.then構造,這是放置拒絕和解決的理想位置,但是不存在執行此操作的函數。
如果我這樣做:
function XPromise(code, resolve, reject) {
return new Promise((resolve, reject) => {
try {
resolve(code());
} catch (exception) {
reject(exception);
}
});
}
async function GetData(testClient, project, testPlan, suiteId) {
return XPromise(code => {
console.debug("GetData");
testClient.getData(project, testPlan, suiteId)
.then(data => {
if (data.length === 0) reject(data);
resolve(data);
});
},
resolve => { },
reject => { }
}
我不知道該如何在“下部”功能中獲得實現的邏輯。
我想要新的Promise包裝器的原因是,我有很多東西要實現...我不想在整個代碼中都這樣做。 這段代碼可以編譯,但是需要我為實現的每個函數編寫New Promises和Try Catch語句。
async function GetData(testClient, project, testPlan, suiteId) {
return new Promise((resolve, reject) => {
console.debug("GetPoints");
try {
testClient.getData(project, testPlan, suiteId)
.then(data => {
if (data.length === 0) reject(data);
resolve(data);
});
} catch (exception) { reject(exception); }
});
}
您不應該通過值參數resolve來拒絕新的Promise()。 它們是在調用回調時由本機Promise對象提供的。 您只需要調用它即可做出承諾,即可解決或拒絕。
new Promise((resolve,reject)=>{
if(condition){
resolve();// resolve is callback sent by promise object. you just invoke it
}else{
reject(); like resolve reject makes this promise to fail
}
});
我認為您最后提到的邏輯是正確的
async function GetData(testClient, project, testPlan, suiteId) {
return new Promise((resolve, reject) => {
console.debug("GetPoints");
try {
testClient.getData(project, testPlan, suiteId)
.then(data => {
if (data.length === 0) reject(data);
resolve(data);
});
} catch (exception) { reject(exception); }
});
}
注意:async / await不能代替promise。 如果要創建一個肯定的保證,則必須創建它。 您可以使用async / await來避免出現鏈式鏈接,並且代碼看起來像是同步的並且易於理解。 但仍然它們仍然是異步的。
但是您可以使用Promise.resolve(),Promise.reject()來避免新的Promise()。 見下文,
async function GetData(testClient, project, testPlan, suiteId) {
console.debug("GetPoints");
try {
const data = await testClient.getData(project, testPlan, suiteId);
if (data.length === 0) return Promise.reject(data);
return Promise.resolve(data);
} catch (exception) { return Promise.reject(exception); }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.