我有两个用promise编写的函数:
const resolvedDelay = (value, ms) => new Promise(resolve => setTimeout(() => resolve(value),ms));
const rejectedDelay = (value, ms) => new Promise((resolve,reject) => setTimeout(() => reject(value),ms));
我尝试通过async / await重写它们。这是我的错误尝试:
const resolvedDelay = async (value, ms) => setTimeout(() => value,ms); // I haven't reference to `resolve` here... :(
const rejectedDelay = async (value, ms) => setTimeout(() => {throw new Error(value)},ms);
如何正确处理?
答案 0 :(得分:1)
通常会执行类似的操作,将setTimeout转换为可重用的Promise,然后再等待。
const delay = time => new Promise(res => setTimeout(res, time));
const resolvedDelay = async (value, ms) => {await delay(ms); return value;};
const rejectedDelay = async (value, ms) => {await delay(ms); throw Error(value);};
答案 1 :(得分:0)
这就是我要这样做的方式,我不知道使它保留为箭头功能的方式。
function resolvedDelay(value, ms) {
return new Promise(resolve => {
setTimeout(() => {
resolve(value);
}, ms);
});
}
function rejectedDelay(value, ms) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(value);
}, ms);
});
}
async function callFunctions() {
const resolved = await resolvedDelay();
const rejected = await rejectedDelay();
// Do whatever you want with them now
}
答案 2 :(得分:0)
您必须先有一个承诺,才能对await
做任何有用的事情。而且,由于setTimeout()
不会创建承诺,也不会解决或拒绝承诺,因此您必须像在第一个代码块中那样创建承诺并将其绑定到setTimeout()
回调中。
您的第二个代码块仅调用setTimeout()
并立即返回。将其包装在async
中会使其返回一个承诺,但是当函数在调用setTimeout()
之后返回时,该承诺会立即得到解决。因此,当setTimeout()
回调触发时,您必须解决或拒绝一个诺言,而仅使用async
函数包装就无法做到这一点。
因此,async/await
在创建两个函数时没有真正的用处。您手动创建承诺的第一组功能就是这里的方法。
当然,调用者可以将await
与第一组函数一起使用而无需更改。