如何在setTimeout里返回一个Promise?

好比有个方法check的返回值是个promise

const check = (rule, value) => {
  if (!value) {
    return Promise.reject('不能为空')
  }
 }

如何在setTimeout里执行这个方法并且返回值是promise?

比如。。
setTimeout(() => {
  return check(...rest)
})
阅读 5k
4 个回答

没办法。但是你可以直接返回 Promise 呀。

return new Promise(function(resolve){
  setTimeout(() => {
    resolve(check(...rest))
  })
})

setTimeout 是不 care 它的 callback 返回值的,也没地方去处理这个返回值。一般想使用这个值,都会采用 callback 设计模式,举个例来说

300 毫秒之后会产生一个随机值,把这个随机值显示出来(为简写代码用 jQuery)
function generateRandomAfterMilliseconds(cb, timeout = 300) {
    setTimeout(() => cb(Math.random(), timeout);
}

function doBusiness() {
    generateRandomAfterMilliseconds((v) => {
        $("div.random").text(v);
    });
}

在有了 Promise 之后,这个过程可以封装成 Promise(注意,是把 setTimeout 封装成 Promise,而不是在 setTimeout 里返回 Promise)。Promise 的作用就是封装异步操作。

function generateRandomAfterMilliseconds(timeout = 300) {
    return new Promise(resolve => {
        setTimeout(() => resolve(Math.random()), timeout);
    });
}

function doBusiness() {
    generateRandomAfterMilliseconds().then(v => $("div.random").text(v));
}

说白了,还是使用的回调的形式。如果想写成平时习惯的同步代码的形式(注意,只是形式),需要使用 await 语法

async function doBusiness() {
    const v = await generateRandomAfterMilliseconds();
    $("div.random").text(v);
}

也许这就是你期望的调用方式,是由 async/await 语法提供的,详情参阅:理解 JavaScript 的 async/await

更多关于异步处理的文章在这里

1、setTimeout方法固定返回一个数字timer,取消定时器时就可以clearTimeout(timer)setTimeout并不会处理其参数方法的返回值
2、针对你上面的需求,只能单独赋值了

let pro = null;
setTimeout(() => {
  pro = check(...rest)
})

不行。

你的需求是想等待一段时间再返回值?

是的话可以这样async 函数

function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)) }

async function foo() {
    await sleep(1000)
    return 1 
}

async function main() {
    const result = await foo()
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题