Подтвердить что ты не робот

Как подождать, пока обещание будет разрешено?

Я имею дело с инфраструктурой NodeJs, которая требует, чтобы определенная функция была синхронной, но мне нужно получить значение, доступ к которому можно получить только асинхронно. В идеальном мире я мог бы вернуть обещание, но я не могу.

В качестве быстрого и грязного решения я создал следующий метод:

exports.synchronizePromise = function(promise) {
    var value;
    promise.then(function(promiseValue) {
        value = promiseValue;
    });
    while (!value) {} // Wait for promise to resolve
    console.log("DONE: " + value); // Never reached
    return value;
};

Но я получаю сообщение об ошибке. Есть ли способ выполнить то, что мне нужно?

4b9b3361

Ответ 1

Учитывая, что node по умолчанию только однопоточный, на самом деле нет простого способа решить эту проблему. Есть один, хотя. Базы на генераторах/волокнах вы можете добавить своего рода параллельное выполнение в node. Существует waitfor реализация на основе этого.

Ответ 2

В Q, если у вас есть разрешенные обещания, вы можете просто взять значение с помощью проверки

exports.synchronizePromise = function(promise) {
  var i = promise.inspect();
    if (i.state === "rejected") {
      throw i.reason;
    } else if (i.state === "fulfilled") {
      return i.value;
    } else {
      throw new Error("attempt to synchronize pending promise")
    }
};

Однако, если обещание находится на рассмотрении, оно действительно асинхронно, и тогда ваш вопрос не имеет смысла, и функция вызовет ошибку.

Ответ 3

Promises являются асинхронными. Они представляют собой будущую ценность - значение, доступное в 1 мс, или 1 минуту, или 1 день, или 1 год в будущем, или никогда. По определению, нет способа "заставить" их разрешить, кроме машины времени.

Если у вас есть логика восходящего потока, которая построена на предпосылке синхронности, но по какой бы причине она не зависела, теперь она асинхронна, вам нужно реорганизовать этот компонент вверх, чтобы работать асинхронно. Альтернативы нет.

Если ваша инфраструктура "требует, чтобы определенная функция была синхронной", когда эта функция не является или не может быть синхронной, тогда структура плохо разработана и непригодна для использования или, по крайней мере, не подходит для вашей проблемы.