使用setTimeout()时重写对异步/等待的承诺

时间:2019-11-13 18:07:45

标签: javascript asynchronous promise async-await

我有两个用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);

如何正确处理?

3 个答案:

答案 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与第一组函数一起使用而无需更改。

相关问题