使用计时器模拟长过程

问题描述 投票:0回答:1

我正在尝试创建一个例程来顺序执行一系列测试过程。我什至不知道如何为一个很长的过程创建一个模拟函数。它使用计时器来确保顺序(一个进程在前一个进程完成之前不会启动)。我已经尝试了很多方法,这是一个看起来可能有效的例子......

async function someLongProcess(myInfoStr) {
    // Some async process that takes time
    console.log(myInfoStr + ": Process Starting");
    setTimeout(()=>{
        console.log(myInfoStr + ": Process Finishing");
        return myInfoStr + ": Process Finished";
    }, 1000);
}

someLongProcess("Test A").then(
    function(value) { console.log(value) },
    function(error) { console.log("Oh oh!: " + error) }
);

我想要的结果:“测试A:流程开始”,“测试A:流程完成”,“测试A:流程完成”。

我得到的结果:“测试A:流程开始”,“未定义”,“测试A:流程完成”。

我知道它不起作用,因为返回是在匿名函数内部,并且 someLongProcess 根本没有返回任何承诺。当然,我已经尝试将 return 放在 setTimer 块之后,但也失败了:“测试 A:进程开始”、“测试 A:进程完成”、“测试 A:进程完成”。我已经为此研究了好几个小时了。有办法做到吗? TIA

javascript asynchronous
1个回答
0
投票

您必须使用

Promise
返回
new Promises()

这需要两个参数,第一个参数表示满足,另一个参数表示拒绝,显然我们进入了我们的 catch 块。

并且您无法在

error
块中获得
then
,它仅在
catch
块中可见。下面我添加了
isError
参数来模拟它,并添加了
seconds
参数来模拟
setTimeout

更多关于承诺

async function someLongProcess(myInfoStr,seconds,isError) {
    // Some async process that takes time
    return new Promise((resolve,reject)=>{
        if(isError){
        return reject("I am an errorrr from "+myInfoStr);
      }
      setTimeout(()=>{
        console.log(myInfoStr + ": Process Finishing");
        resolve(myInfoStr + ": Process Finished")
      }, seconds);
    });
}

const test_1 = "Test A";
console.log(test_1 + ": Process Starting");
someLongProcess(test_1,1000).then(value=>{
  console.log(value);
  return value;
}).catch(error=>{
  console.error(error);
  return error
});
.as-console-wrapper { max-height: 100% !important; }

© www.soinside.com 2019 - 2024. All rights reserved.