Вам, вероятно, придется использовать внешний API, большая часть которого стоит денег.
Я нашел это, хотя, кажется, бесплатно: http://hostip.info/use .html
Нет необходимости создавать обещание с помощью new Promise
, когда у вас есть таблица.
Вы можете просто вернуть return result.then(......
или, если хотите быть уверенным, вернуть экземпляр Promise (а не только то, что возвращает then().catch()
), а затем передать результат: Promise.resolve()
if (typeof result.then === "function") {
return Promise.resolve(result).then(function (result) {
if (result !== undefined) {
return { status: 0, result: result };
}
return { status: 0 };
})
.catch(function (err) {
if (typeof err === "object") {
return { status: 400, errorMessage: err.name + ", " + err.message, stack: err.stack };
}
return { status: 400, errorMessage: err };
});
}
[ 119] Если в обратном вызове catch
возникает ошибка, возвращаемое обещание разрешается как отклоненное. Вызывающий может справиться с этим с помощью своего собственного catch
прикованного к нему.
Поскольку результат может быть получен асинхронно, потребитель 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 });
Вам действительно нужно возвращать этот объект синхронно, когда fn()
не вернул обещание? Было бы намного проще, если бы ваша функция всегда могла вернуть обещание. Вы просто resolve
указали бы значение, и независимо от того, было ли это простым значением, потом или обещанием, вы получите от него обещание.
Тогда вы бы связали свою логику обработки результатов / ошибок с этим, только один раз:
function dispatchCall() {
// ...
// return Promise.resolve(fn.apply(context, args))… - doesn't catch synchronous exceptions
return new Promise(function(resolve) {
resolve(fn.apply(context, args)); // promise constructor catches exceptions
}).then(function (result) {
// the promise was fulfilled
if (result !== undefined) {
return { status: 0, result: result };
} else {
return { status: 0 };
}
}, function (err) {
// the promise was rejected
if (typeof err === "object") {
return { status: 400, errorMessage: err.name + ", " + err.message, stack: err.stack };
} else {
return { status: 400, errorMessage: err };
}
});
}