说我有一个函数,可以在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
结果。
我知道这与此处提出的其他问题非常相似,但是我还无法弄清楚。
答案 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);