У меня есть кусок кода, который имеет асинхронную функцию внутри другой функции.Мне нужно дождаться завершения этой асинхронной функции, прежде чем оператор 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
, а не разрешенным значением.Так запутался прямо сейчас.