我尝试创建一个包装承诺的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); }
});
}
答案 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); }
});
}