带有Async / Await的TypeScript和Promise包装器。如何配置遗留代码?

时间:2017-02-02 15:49:33

标签: javascript asynchronous typescript async-await

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

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); }
    });
}

1 个答案:

答案 0 :(得分:4)

你不应该传递值params resolve,拒绝新的Promise()。它们在调用您的回调时由本机promise对象提供。你只需要调用它就可以解决或拒绝承诺。

e3=ScrolledText(window3,width=24,height=13)
e3.grid(row=5,column=1,rowspan=6,columnspan=4)

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

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 / await不是promise的替代品。如果你想确定一个承诺,你必须创建它。你可以使用async / await来避免链接,你的代码看起来像同步和易于理解。但仍然是他们仍然是异步的。

但在你的情况下你可以使用Promise.resolve(),Promise.reject()来避免新的Promise()。见下文,

 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); }
    });
}