暂停javascript异步功能直到用户操作

时间:2017-07-27 16:07:56

标签: javascript ecmascript-6 async-await es6-promise

我有异步功能,我想让它执行到某一点,暂停执行,并在用户做出某些动作(例如点击按钮)时恢复执行功能。我试过这个:

let changed = false;

let promise = new Promise(function(resolve, reject){

    if(changed){

        resolve('success');
    }else{

        reject('failure');
    }
});

async function test(){

    console.log('function started');
    console.log('before await');

    try{

        const fulfilledValue = await promise;
        console.log(fulfilledValue);
    }catch(failure){

        console.log(failure);
    }

    console.log('after await');
};

document.getElementById('change').addEventListener('click', function(){

    if(!changed){

        console.log('changed = true');
        changed = true;
    }else{

        changed = false;
    }
});

test();

然而,它并不像我想的那样工作。异步功能不会等到用户操作。据我所知,这是因为承诺会立即被拒绝,因为"已经改变了#34; flag初始设置为false。如何修复此代码以按预期工作?它有可能吗?

2 个答案:

答案 0 :(得分:8)

根本不要使用changed标志。您无法观察变量或等到它具有特定值(轮询除外,但您不希望这样)。相反,您应该只需从点击处理程序调用{​​{1}}回调:

resolve

答案 1 :(得分:4)

你只需要一种从外面解决你的承诺的方法,那么:

let outsideResolve;
let promise = new Promise(function(resolve) {
    outsideResolve = resolve;

});

现在可以从点击处理程序中调用outsideResolve。