Ждите обратного вызова с чистым JavaScript - PullRequest
0 голосов
/ 28 октября 2018

Я ищу способ дождаться обратного вызова функции перед дальнейшим выполнением в моей программе.Это то, что я исследовал ранее, и у меня есть пара небольших трюков, которые я могу вам сначала показать:

// You can wrap the rest of your code in the callback
/* executing code */
asyncFunction((err, callback)=>{
    if(err)console.log(err)
    else{
        /* The rest of your program */
    }
})

// You can do function chaining (use this to parallel asyncs)
var arr = newArray(2).fill(false)
asyncParallel()
function asyncParallel(){
    asyncFunction1((err,callback)=>{
        if(err)console.log(err)
        else{
            arr[arr.indexOf(false)] = true
            allDone()
        }
    }
    asyncFunction2((err, callback)=>{
        if(err)console.log(err)
        else{
            arr[arr.indexOf(false)] = true
            allDone()
        }
    }      
}
function allDone(){
    if(!arr.includes(false)){
       theRest()
    }
}
function theRest(){
    /* the rest of your code */
}

// You can wrap all of your code in a generator function
function* gen(){
    /* your code */
    yield something
    /* the rest of your code */
}
var g = gen()
g.next()
asyncFunction((err, callback)=>{
    if(err)console.log(err)
    else{
        g.next()
    }
}

//You could also download a fancy pants module which I have no time for

Однако я ищу конкретный способ ожидания обратного вызова.По сути, я хочу, чтобы axios.get сработал, и тогда моя программа выходит за пределы этого шага и попадает в пробку, а при обратном вызове я хочу освободить пробку.Это должно выглядеть следующим образом:

axios.get('myUrl').then(res=>{trigger()})
/* function to wait for trigger */
/* the rest of my code */

Возможно, у вас возникнет соблазн поместить цикл while, но это остановит выполнение любого следующего кода:

var x = false
axios.get('myUrl').then(res=>{x = true})
while(x === false){
    // this will stop any other code from executing.
    // x will never be set to true.
}

Кроме того, установка таймаута не приведет кработать в этом случае, потому что она сама по себе является асинхронной функцией и не будет препятствовать дальнейшему выполнению кода (если она не заключена в функцию, которая вызывается в обратном вызове):

axios.get('myUrl').then(res=>{x = true})
setTimeout(/*I could put the code in here, but I don't want 
    to.*/, 10000)
/* code here will get executed before callbacks */

Есть ли способ поставитьтриггер в моем обратном вызове, и есть ли специальная функция, не блокирующая код, ожидающая этого триггера, прежде чем переходить любой другой код без необходимости заключать весь мой код в другую функцию?Я с нетерпением жду ваших ответов и надеюсь, что этот пост помог людям!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...