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)
你不应该将值参数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)
| 归档时间: |
|
| 查看次数: |
2925 次 |
| 最近记录: |