Обещание и изменение возвращаемого значения

Вам, вероятно, придется использовать внешний API, большая часть которого стоит денег.

Я нашел это, хотя, кажется, бесплатно: http://hostip.info/use .html

1
задан ygoe 17 March 2019 в 20:48
поделиться

3 ответа

Нет необходимости создавать обещание с помощью 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 прикованного к нему.

0
ответ дан trincot 17 March 2019 в 20:48
поделиться

Поскольку результат может быть получен асинхронно, потребитель 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 });
0
ответ дан CertainPerformance 17 March 2019 в 20:48
поделиться

Вам действительно нужно возвращать этот объект синхронно, когда 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 };
        }
    });
}
0
ответ дан Bergi 17 March 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: