异步和Await功能无法正常工作



我的异步和等待函数似乎遇到了一个问题,无法工作,而且我对此还比较陌生。。。

当我调用CallToPopulateCustomerDropDown时,我永远不会调用SetCustomerMultiColumnAfterAddingNewCustomerFromNewOrder(我知道这一点,因为我在其中有断点,它永远不会被命中(。所以我认为我写错了

这是我的代码

async function CallToPopulateCustomerDropDown(ddlCustomer, selectedValue) {
await CallPopulateCustomerDropDown(ddlCustomer, selectedValue);
SetCustomerMultiColumnAfterAddingNewCustomerFromNewOrder();
}
function CallPopulateCustomerDropDown(ddlCustomer, selectedValue) {
try {
return new Promise((resolve, reject) => {
LogCallStackToConsole('populateCustomerDropDown(ddlCustomer, selectedValue)');
//#region Variable Declarations
let orderField, grid, ds, foundCatalog, dd;
//#endregion
for (i = 0; i < CustomersList.length; i++) {
if (CustomersList[i].Company.length == 0) {
CustomersList[i].Company = CustomersList[i].FirstName + " " + CustomersList[i].LastName
}
}
$(ddlCustomer).empty();
$(ddlCustomer).kendoMultiColumnComboBox({
placeholder: "Select Customer...",
dataTextField: "Company",
dataValueField: "CustomerID",
height: 300,
columns: [
{ field: "FirstName", title: "First", width: 200 },
{ field: "LastName", title: "Last", width: 200 },
{ field: "Company", title: "Company", width: 200 }
],
footerTemplate: "#: instance.dataSource.total() # Customers Found",
filter: "contains",
filterFields: ["FirstName", "LastName", "Company"],
dataSource: {
data: CustomersList,
sort: [
{ field: "FirstName", dir: "asc" },
{ field: "LastName", dir: "asc" },
{ field: "Company", dir: "asc" }
]
},
change: function () {
},
select: function (e) {
LogCallStackToConsole('populateCustomerDropDown(ddlCustomer, selectedValue).select');
orderField = $('#txtOrderName').val();
grid = $('#gridNewOrder').getKendoGrid();
ds = grid.dataSource.view();
foundCatalog;
for (let i = 0; i < ds.length; i++) {
if (ds[i].Catalog.length > 0) {
foundCatalog = true;
break;
}
}
if (orderField.length > 0 && foundCatalog) {
$('#btnOK').prop("disabled", false);
}
}
});
if (selectedValue != null) {
dd = $(ddlCustomer).data("kendoMultiColumnComboBox");
dd.value(selectedValue);
}
});
resolve();
}
catch (err) {
reject();
}
}
function SetCustomerMultiColumnAfterAddingNewCustomerFromNewOrder() {
let customerMultiColumn = $('#ddlCustomer').data("kendoMultiColumnComboBox");
customerMultiColumn.select(function (dataItem) {
return dataItem.Company === g_CustomerEditorObject.companyName;
});
ResetGlobalObject(g_CustomerEditorObject);
}

缩短代码,您将执行以下操作:

return new Promise((resolve, reject) => {
...
});
resolve();

注意你是如何在Promise回调函数块的外部调用resolve()的,这意味着你的代码无法访问它。你也在对catch()进行同样的操作,你在它可用的函数之外使用它。如果你想了解更多关于这方面的信息,你可以研究;Javascript范围">

你可能正在尝试这样做:

return new Promise((resolve, reject) => {
try {
LogCallStackToConsole('populateCustomerDropDown(ddlCustomer, selectedValue)');
...
resolve();
}
catch (err) {
reject();
}
});

然而,您的代码实际上并没有执行任何异步操作,因此您不需要在这里进行承诺,至少在本实现中不需要。承诺是指处理一个函数;稍后";,就像网络呼叫。您的函数似乎与常规Javascript函数一样同步执行。没有您正在等待的回调或操作。

您在promise 之外调用resolve

此外,如果函数正在返回promise,那么尝试捕获promise是一种糟糕的设计。调用函数的代码应该尝试/捕获返回的promise,如下所示:

async function CallToPopulateCustomerDropDown(ddlCustomer, selectedValue) {
try{
await CallPopulateCustomerDropDown(ddlCustomer, selectedValue);
SetCustomerMultiColumnAfterAddingNewCustomerFromNewOrder();
}catch(err){
console.log(err)
}
}
function CallPopulateCustomerDropDown(ddlCustomer, selectedValue) {
return new Promise((resolve, reject) => {
LogCallStackToConsole('populateCustomerDropDown(ddlCustomer, selectedValue)');
// ....the rest of your code
// if you code has a problem, you can choose to reject
// return reject('the reason')
resolve()
});
}

最新更新