Асинхронный процесс внутри родительской функции - вернуть результат асинхронного процесса? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть кусок кода, который имеет асинхронную функцию внутри другой функции.Мне нужно дождаться завершения этой асинхронной функции, прежде чем оператор return будет выполнен в родительской функции.Я новичок в обещаниях и, несмотря на мое обширное чтение по stackoverflow, я просто не могу понять порядок правильно, поэтому мой оператор return родительской функции выполняется до выполнения асинхронного процесса.Асинхронный процесс должен вернуть строку, а затем я хотел бы вернуть эту строку из родительской функции.Я надеюсь, что кто-то может помочь мне структурировать это.

//Call the parent function
mgmtTractPopupBox.setContent(mgmtPopupContent);

function mgmtPopupContent(feature) {
    //set up query
    //Need this query to complete before executing "return content;" below
    //"relatedQuery" returns a deferred object, once that resolves, 
    //it enters the callback function.
    var content = queryableMgmtTractFL.queryRelatedFeatures(relatedQuery, relatedQueryComplete).then(function(value) {
        //This prints the result value of the relatedQuery promise (an Object), 
        //which is not what I need. I need the HTML string created in the
        //the relatedQueryComplete function.
        console.log(value);
    });
    //This executes before the asynchronous process has finished
    return content;
}

function relatedQueryComplete(relatedRecords) {
    return new Promise(function (resolve) {
        var content = '<table id="mgmtPopupTable1"><tr><th>Veg Mgmt Practice</th><th>Herbicide</th><th>Month</th><th>Year</th>\
            <th>Implemented By</th><th>Funded By</th><th>Farm Bill Code</th></tr>';
        //do stuff that adds to content variable
        content = content + '</table>';
        resolve(content);
    });
}

Я понимаю, что relatedQueryComplete должен возвращать обещание, и внутри этого обещания я должен иметь возможность получить доступ к значению, которое, я полагаю, будетcontent что я выполнил обещание.Мой .then() не возвращает значение обещания relatedQueryComplete, а вместо этого возвращает разрешенное значение relatedQuery.Я пытался структурировать подобные обещания, но безуспешно:

var content = queryableMgmtTractFL.queryRelatedFeatures(relatedQuery).then(relatedQueryComplete).then(function(value){...}

Очевидно, мое понимание обещаний нарушено.Может ли кто-нибудь помочь мне правильно структурировать это?Дополнительно - мне действительно нужно передать дополнительный параметр в мою функцию обратного вызова relatedQueryComplete, но ...(relatedQuery, relatedQueryComplete(extraParam))... не выполняет эту работу.Я знаю, что мне понадобится какая-нибудь обертка, такая как

callback(function(resultFromRelatedQuery){
   relatedQueryComplete(resultFromRelatedQuery, extraParam)
});

, но resultFromRelatedQuery в итоге окажется отложенным объектом relatedQuery, а не разрешенным значением.Так запутался прямо сейчас.

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете использовать недавно добавленную функциональность async/await.Скажем, у вас есть firstAsyncFunction и secondAsyncFunction.

async function secondAsyncFunction(param1, param2) {
    const result1 = await firstAsyncFunction();
    // do stuffs with result1, get a new result
    return resultFromSecondAsyncFunction;
}

Затем вы можете использовать это следующим образом:

secondAsyncFunction(param1, param2).then((resultFromSecondAsyncFunction) => {
    // do stuffs with resultFromSecondAsyncFunction...
});

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

Вы можете проверить javascript.info / async-await , чтобы узнать больше о async/await.

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