Как получить доступ к предыдущим результатам обещания в цепочке .then ()?

Насколько я знаю, каждый метод, определенный в интерфейсе, неявно abstractpublic). Но если вы объявите свой класс реализации как abstract, вы можете пропустить реализацию одного или нескольких методов, определенных в реализованном интерфейсе.

abstract class Sphere implements Sheet {
 public double computeArea() {
    // do something
}

// skip computePerimeter():
// public double computerPerimeter();
}
585
задан Peter Mortensen 5 June 2016 в 09:49
поделиться

2 ответа

То, что я узнаю об обещаниях, должно использовать его только в качестве возвращаемых значений , стараются не ссылаться на них , если это возможно. асинхронный/ждавший синтаксис особенно практичен для этого. Сегодня все последние браузеры и узел поддерживают его: https://caniuse.com/#feat=async-functions, простое поведение, и код похож на читающий синхронный код, забудьте об обратных вызовах...

В случаях я действительно должен сослаться, обещания состоят в том, когда создание и разрешение происходят в местах independent/not-related. Так вместо этого искусственная ассоциация и вероятно слушатель события только для разрешения "удаленного" обещания я предпочитаю выставлять обещание как Задержанный, который следующий код реализует его в допустимом транссложенном es5

/**
 * Promise like object that allows to resolve it promise from outside code. Example:
 *
```
class Api {
  fooReady = new Deferred<Data>()
  private knower() {
    inOtherMoment(data=>{
      this.fooReady.resolve(data)
    })
  }
}
```
 */
var Deferred = /** @class */ (function () {
  function Deferred(callback) {
    var instance = this;
    this.resolve = null;
    this.reject = null;
    this.status = 'pending';
    this.promise = new Promise(function (resolve, reject) {
      instance.resolve = function () { this.status = 'resolved'; resolve.apply(this, arguments); };
      instance.reject = function () { this.status = 'rejected'; reject.apply(this, arguments); };
    });
    if (typeof callback === 'function') {
      callback.call(this, this.resolve, this.reject);
    }
  }
  Deferred.prototype.then = function (resolve) {
    return this.promise.then(resolve);
  };
  Deferred.prototype.catch = function (r) {
    return this.promise.catch(r);
  };
  return Deferred;
}());

, формируют мой проект машинописного текста:

https://github.com/cancerberoSgx/misc-utils-of-mine/blob/2927c2477839f7b36247d054e7e50abe8a41358b/misc-utils-of-mine-generic/src/promi se.ts#L31

Для более сложных случаев я часто использую их парень маленькие утилиты обещания без зависимостей, протестированных и введенных. p-карта несколько раз была полезна. Я думаю, что он покрыл большинство вариантов использования:

https://github.com/sindresorhus? utf8 = % E2%9C%93& tab=repositories& q=promise& type=source& язык =

-1
ответ дан 22 November 2019 в 21:58
поделиться

Решение:

можно поместить промежуточные значения в объем в немного позже 'затем', функция явно, при помощи 'связывают'. Это - хорошее решение, которое не требует изменения, как работают Обещания, и только требует, чтобы строка или два из кода распространили значения точно так же, как ошибки уже распространены.

Вот полный пример:

// Get info asynchronously from a server
function pGetServerInfo()
    {
    // then value: "server info"
    } // pGetServerInfo

// Write into a file asynchronously
function pWriteFile(path,string)
    {
    // no then value
    } // pWriteFile

// The heart of the solution: Write formatted info into a log file asynchronously,
// using the pGetServerInfo and pWriteFile operations
function pLogInfo(localInfo)
    {
    var scope={localInfo:localInfo}; // Create an explicit scope object
    var thenFunc=p2.bind(scope); // Create a temporary function with this scope
    return (pGetServerInfo().then(thenFunc)); // Do the next 'then' in the chain
    } // pLogInfo

// Scope of this 'then' function is {localInfo:localInfo}
function p2(serverInfo)
    {
    // Do the final 'then' in the chain: Writes "local info, server info"
    return pWriteFile('log',this.localInfo+','+serverInfo);
    } // p2

Это решение может быть вызвано следующим образом:

pLogInfo("local info").then().catch(err);

(Примечание: более сложная и полная версия этого решения была протестирована, но не эта версия в качестве примера, таким образом, это могло иметь ошибку.)

0
ответ дан 22 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

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