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