如何等待在Javascript中返回API结果?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (119)

假设我有一个函数在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结果。我知道这与此处提出的其他问题非常相似,但我还是想不通。

提问于
用户回答回答于

没有正确地将其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);

扫码关注云+社区

领取腾讯云代金券