T M*_*ack 4 javascript asynchronous async-await electron
我正在努力在程序中创建一个简单的等待功能。我想使用Promise并尽可能地异步等待。到目前为止,我有:
function waitForCondition(conditionObj) {
var start_time = new Date().getTime()
function checkFlag() {
if (conditionObj.arg == conditionObj.test) {
console.log('met');
return new Promise(resolve => setTimeout(resolve, 1));
} else if (new Date() > start_time + 3000) {
console.log('not met, time out');
return new Promise(resolve => setTimeout(resolve, 1));
} else {
window.setTimeout(checkFlag, 1000);
}
}
checkFlag();
}
async function run() {
console.log('before');
await waitForCondition({arg: '1', test: '1'})
console.log('after');
}
run();
Run Code Online (Sandbox Code Playgroud)
它应该每1秒钟检查一次,最长为3秒。控制台应如下所示:
'before'
'met'
'after'
Run Code Online (Sandbox Code Playgroud)
您必须return保证:
function waitForCondition(conditionObj) {
return new Promise(resolve => {
var start_time = Date.now();
function checkFlag() {
if (conditionObj.arg == conditionObj.test) {
console.log('met');
resolve();
} else if (Date.now() > start_time + 3000) {
console.log('not met, time out');
resolve();
} else {
window.setTimeout(checkFlag, 1000);
}
}
checkFlag();
});
}
async function run() {
console.log('before');
await waitForCondition({arg: '1', test: '1'})
console.log('after');
}
run();
Run Code Online (Sandbox Code Playgroud)
我重构了一下您的代码。要获取当前时间,请使用Date.now()。并且您可以在resolve没有1毫秒超时的情况下进行调用。