簡體   English   中英

具有Async / Await的TypeScript和Promise包裝器。 如何綁定舊代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM