Поскольку результат может быть получен асинхронно, потребитель dispatchCall
должен иметь логику для ожидания возвращения асинхронных данных. Одним из вариантов было бы для dispatchCall
вернуть Обещание, которое в конечном итоге разрешается в объект { status, result }
(или { status, error }
), который вы ищете:
if (typeof result.then === "function") {
return result
.then((resolveValue) => {
return { status: 0, result: resolveValue };
})
.catch((error) => {
return { status: 400, error };
})
}
И в потребителе [117 ], проверьте, является ли возвращаемое значение Обещанием - если это так, вызовите .then
для него:
const dispatchResult = dispatchCall();
if (typeof dispatchResult.then === 'function') {
dispatchResult.then(({ status, result, error }) => {
// do stuff with status, result, error here
// if there was an error, result will be undefined
});
} else {
// do stuff with dispatchResult.status, .result, .errorMessage
}
Вы также можете рассмотреть возможность возврата Обещания независимо от того, result
ли [119] является Обещанием или нет, чтобы облегчить управление кодом - например, в синхронном разделе:
return Promise.resolve({ status: 0, result: result });
У вас почти это было - просто отбросьте кавычки вокруг аргумента индексатора:
{Binding FileTypes[aspx]}
Более сложная структура данных будет просто требуется последовательность индексаторов, например
{Binding Foo[aspx][Bar]}
. Кстати, хороший ресурс для этого материала находится в MSDN, в разделе WPF> Данные> Связывание данных> Обзор объявлений привязки - прокрутите вниз до «Синтаксис пути привязки», чтобы получить сводную информацию о обозначения и условные обозначения, которые можно использовать в пути привязки.