gpt4 book ai didi

javascript - 带有 Async/Await 的 TypeScript 和 Promise 包装器。我如何绑定(bind)遗留代码?

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:04 25 4
gpt4 key购买 nike

我正在尝试创建一个 JavaScript/typescript 函数来包装一个 promise ,方法是返回一个新的 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 => { }
}

我不知道如何让 then 逻辑在“低级”函数中完成它。

我想要新的 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,reject 传递给 new Promise()。它们在调用您的回调时由 native 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。如果你想创建一个 promise sure ,你必须创建它。您可以使用 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); }
}

关于javascript - 带有 Async/Await 的 TypeScript 和 Promise 包装器。我如何绑定(bind)遗留代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42006557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com