一段时间后如何解决JS承诺?

San*_*apa 1 javascript promise es6-promise

我正在学习 JS Promise。我对如何在运行 cb 函数(需要 5 秒)后重新处理 f2 返回的承诺感到有点困惑。

var cb = function(){
  console.log('5 sec');
}

var f2 = function(){
    return new Promise((resolve,reject)=>{
      setTimeout(cb, 5000);
      console.log('Last line of f2')
     resolve('5RESOLVED')
    });
}

f2().then(res=>{
  console.log(res)
})

Run Code Online (Sandbox Code Playgroud)

当前输出按以下顺序排列

  • f2的最后一行
  • 5已解决
  • 5秒

我希望输出为 - Last line of f2 - 5 sec -5Resolved

Ber*_*rgi 5

您需要将resolve(\xe2\x80\xa6)调用放在 asynchronous 内部cb,以便它仅在 5 秒后发生。目前,您正在立即调用它(在安排回调之后)。使用

\n\n
function f2() {\n  return new Promise((resolve,reject) => {\n    setTimeout(function() {\n      console.log(\'5 sec\');\n      resolve(\'5RESOLVED\')\n    }, 5000);\n    console.log(\'Last line of f2\');\n  });\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

更好的是,我建议不要自己编写任何异步回调(这很容易出错),而只处理基于 Promise 的辅助函数:

\n\n
function delay(t) {\n  return new Promise(resolve => {\n    setTimeout(resolve, t);\n  });\n}\nasync function f2() {\n  console.log("last line of f2");\n  await delay(5000);\n  console.log("5 sec");\n  return "5RESOLVED";\n}\n
Run Code Online (Sandbox Code Playgroud)\n