假设我有一个函数,它在1秒后返回输入的结果:
function slowDouble(num) {
setTimeout(() => {
return num * 2;
}, 1000);
}
现在我想调用这个函数并等待返回结果,这样我就可以对它进行其他操作了。我试图将此函数包装在Promise
中,但在执行log
语句(打印undefined
)后,结果被返回给then块:
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
结果。我知道这与这里问的其他问题非常相似,但我还不能解决这个问题。
发布于 2018-10-04 03:36:23
您没有正确地将setTimeout
包装到promise中。您的slowDouble
不会返回任何内容。这就是你得到undefined
的原因。您需要更改这段代码的编写方式,以便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);
https://stackoverflow.com/questions/52634278
复制相似问题