javascript - 等待 JavaScript 返回 API 结果

标签 javascript node.js asynchronous async-await

假设我有一个函数,它会在 1 秒后返回输入结果:

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

现在我想调用这个函数并等待结果返回,这样我就可以对其进行其他操作。我尝试将此函数包装在 Promise 中,但在执行 log 语句后,结果返回到 then block (打印 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

并得到了相同的未定义结果。 我知道这与此处提出的其他问题非常相似,但我还无法弄清楚。

最佳答案

您没有正确地将 setTimeout 包装到 promise 中。您的 slowDouble 不会返回任何内容。这就是为什么你会得到未定义。您需要更改编写此代码的方式,以便 slowDouble 函数返回一个 Promise,并且您可以摆脱 promisify 函数。

不同之处在于,当您构建 Promise 时,您需要能够从您尝试包装的任何异步函数的回调中调用 resolve 回调。对于 setTimeout,我们需要在 setTimeout 的回调中调用 resolve

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);

关于javascript - 等待 JavaScript 返回 API 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52634278/

相关文章:

node.js - 异步上传多个文件到谷歌云存储桶

node.js - 错误!请求的依赖类型无效 : alias

java - 具有 CompletableFuture 的非阻塞异步 Jersey JAX-RS

javascript - 如何使用来自外部资源的 paperscript?

javascript - 获得点击按钮的正确位置(涟漪效应)

javascript - 将图像传递给 Tesseract.js OCR

javascript - 如何用 'http get' 更新 $scope 变量?

Javascript/Angular 在声明数组之前对其进行切片

node.js - 如何在 Jade 模板中预填充编辑页面(Node + Express + Jade)

file - 如何使用 tokio::fs 复制文件