Async / Await Not Waiting, как я этого ожидаю - PullRequest
0 голосов
/ 06 декабря 2018

Пожалуйста, потерпите меня, я попал в новый проект и пытаюсь принять все это. Я добился прогресса за последние пару дней, но, похоже, не могу преодолеть этот последний горб.Надеюсь, я смогу объяснить это правильно.

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

...Get some information the user wants and start to do some work to load 
up the page and set up the form.
...old stuff working fine...

//Time for my new stuff
var testValue
async function test() {
    await http.post(appConfig.serviceRootUrl + '/api/XXX/YYY', 
    { mProperty: myObject.collectionInObject.itemInCollection }).then(function (result) {
        if (result.length < 1) {
            testValue= false;
        }
        else if (result[0].infoIWant.trim().length > 0) {
            testValue= true;
        }
    });
}
test(); 

//Originally above in the if I was just seeing if I got a result 
//and setting testValue to true/false but changed it for debugging 
//and I am surely getting back correct values when the data exists 
//or result.length zero when no data for it


...Do a bunch of more stuff that is old and working correctly....

//Test the new stuff up above

 alert(testValue);

Большую часть времени я возвращаю правильное истинное или ложное в предупреждении, но время от времени я возвращаюсь неопределенным.Я предполагаю, что неопределенное связано с тем, что оно получает предупреждение до того, как завершится async / await.У меня сложилось впечатление, что он не пройдет мимо строки, где я вызываю «test ();».Я думал, что это фактически заставляет это останавливать что-либо ниже test ();пока ожидание не закончится.Первоначально это было немного сложнее, но я продолжаю сокращать его, чтобы сделать его (надеюсь) более простым / простым.

Чего мне не хватает в моих мыслях или реализации?

Любая помощь очень ценится, когда я гоняюсь за своим хвостом.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Это не так, как работают асинхронные функции.Функция появляется только в самой функции.Вне функции она вызывается и возвращает обещание синхронно.

Другими словами, если вы напишите:

 let t = test()

t будет обещанием, которое разрешается, когда возвращается test().В вашем текущем коде, если вы хотите ответить за пределы функции, вам потребуется что-то вроде:

async function test() {
    let result = await http.post(appConfig.serviceRootUrl + '/api/XXX/YYY', 
    { mProperty: myObject.collectionInObject.itemInCollection })
    if (result.length < 1) return false
    else if (result[0].infoIWant.trim().length > 0)  return true;
}


// test is an async function. It returns a promise.
test().then(result => alert("result: " + result ))

Редактирование на основе комментариев
Вот рабочая версия, использующая Axios для httpКоманда .post:

async function test() {
    let result = await axios.post('https://jsonplaceholder.typicode.com/posts', 
    { mProperty: "some val" })
    return result.data
}


// test is an async function. It returns a promise.
test().then(result => console.log(result ))
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
0 голосов
/ 07 декабря 2018

Как насчет этого?

...Get some information the user wants and start to do some work to load 
    up the page and set up the form.
    ...old stuff working fine...

    //Time for my new stuff
    var testValue
    async function test() {
       let promise = new Promise( (resolve, reject) => resolve( http.post(appConfig.serviceRootUrl + '/api/XXX/YYY', 
        { mProperty: myObject.collectionInObject.itemInCollection }).then(function (result) {
            if (result.length < 1) {
                testValue= false;
            }
            else if (result[0].infoIWant.trim().length > 0) {
                testValue= true;
            }
        })));
     await promise;
 alert(testValue);
    }
    test(); 

    //Originally above in the if I was just seeing if I got a result 
    //and setting testValue to true/false but changed it for debugging 
    //and I am surely getting back correct values when the data exists 
    //or result.length zero when no data for it


    ...Do a bunch of more stuff that is old and working correctly....

    //Test the new stuff up above
0 голосов
/ 06 декабря 2018

Если вы используете синтаксис .then(), не await, и наоборот.Я ошибался по поводу совместимости браузера с async / await, кажется, я не поспевал за сценариями браузера в пользу Node.Но также, поскольку вы используете jQuery, $.ajax() может быть хорошим вариантом для вас, потому что вам не нужны async / await или .then(), и вы можете сделать это так:

$.ajax(appConfig.serviceRootUrl + '/api/XXX/YYY', {
    method: 'POST',
    data: { mProperty: myObject.collectionInObject.itemInCollection }
}).done(function(data) {
    //use result here just as you would normally within the `.then()`
})

Надеюсь, это более полезно, чем мой первоначальный ответ.

...