使用 Async/Await 的 TypeScript 和 Promise 包装器。如何绑定遗留代码?

Joh*_*ers 3 javascript asynchronous async-await typescript

我正在尝试创建一个 JavaScript/typescript 函数来包装一个 Promise,通过返回一个新的 Promise,添加一个 try catch 和一个回调供用户编写代码。这是一个概念:

function XPromise(code) {
    return new Promise((resolve, reject) => {
        try {
           resolve(code());
        } catch (exception) {
            reject(exception);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

但是我将如何在类似这样的事情中使用上面的代码片段:

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);
            });
}
Run Code Online (Sandbox Code Playgroud)

遗留代码使用 .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 => { }
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何让逻辑在“较低”的功能中完成它的事情。

我想要新的 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); }
    });
}
Run Code Online (Sandbox Code Playgroud)

Vig*_*esh 5

你不应该将值参数resolve,reject传递给new 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
  }
});
Run Code Online (Sandbox Code Playgroud)

我认为你最后提到的逻辑是正确的

 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); }
    });
}
Run Code Online (Sandbox Code Playgroud)

注意: async/await 不能替代 Promise 。如果你想创造一个承诺,你就必须创造它。您可以使用 async/await 来避免 then 链,并且您的代码看起来像同步且易于理解。但它们仍然是异步的。

但在你的情况下,你可以使用 Promise.resolve() 、 Promise.reject() 来避免 new 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); }    
}
Run Code Online (Sandbox Code Playgroud)