等待API结果以JavaScript返回

时间:2018-10-03 19:21:15

标签: javascript node.js asynchronous async-await

说我有一个函数,可以在1秒后返回输入的结果:

function slowDouble(num) {
    setTimeout(() => {
        return num * 2;
    }, 1000);
}

现在,我想调用此函数并等待结果返回,以便可以对其执行其他操作。我试图将此函数包装在Promise中,但是在执行log语句(打印undefined)后,结果返回到然后阻塞:

function promisify(num) {
    return new Promise((resolve) => {
        var res = slowDouble(num);
        resolve(res);
    });
}

function promisifyTest(num) {
    promisify(num).then((res) => {
        console.log('then result ', res);
    })
}

promisifyTest(4); // undefined

然后我尝试使用await

async function asyncCallToAPI(num) {
    var tt = await promisify(num);
    console.log('async result', tt);
}

asyncCallToAPI(3); // undefined

,并返回相同的undefined结果。 我知道这与此处提出的其他问题非常相似,但是我还无法弄清楚。

1 个答案:

答案 0 :(得分:2)

您没有正确地将setTimeout包装成一个承诺。您的slowDouble不返回任何内容。这就是为什么您得到undefined的原因。您需要更改编写方式,以使slowDouble函数返回promise,并且可以摆脱promisify函数。

区别在于,当您构造一个Promise时,您需要能够从回调中为要包装的任何异步函数调用resolve回调。对于setTimeout,我们需要在对resolve的回调中调用setTimeout

function slowDouble(num) {
  return new Promise(resolve => {
    setTimeout(() => resolve(num * 2), 1000);
  });
}

async function promisifyTest(num) {
  const result = await slowDouble(num);
  console.log('Async result:', result);
}

console.log('Waiting...');
promisifyTest(4);