假设我有一个函数,它会在 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/