Передайте дополнительный параметр в цепочку обещаний [дубликат]

Код для интерфейса. Не реализация не имеет отношения к Java, а также к конструкции интерфейса.

Эта концепция была выведена в известность в книгах «Шаблоны / Банды четырех», но, скорее всего, была вокруг нее задолго до этого. Концепция, безусловно, существовала задолго до того, как существовала Java.

Конструкция интерфейса Java была создана для помощи в этой идее (среди прочего), и люди стали слишком сосредоточены на конструкции как центр смысла, а не оригинальное намерение. Тем не менее, это причина, по которой у нас есть общедоступные и частные методы и атрибуты в Java, C ++, C # и т. Д.

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

И вы можете запрограммировать интерфейс, а не реализацию, не используя конструкцию интерфейса. Вы можете запрограммировать интерфейс, а не реализацию на C ++, которая не имеет конструкцию интерфейса. Вы можете интегрировать две огромные корпоративные системы гораздо надежнее, если они взаимодействуют через публичные интерфейсы (контракты), а не вызывают методы для объектов, внутренних для систем. Ожидается, что интерфейсы всегда будут реагировать на один и тот же ожидаемый путь с учетом тех же входных параметров; если реализован интерфейс, а не реализация. Концепция работает во многих местах.

Встряхните мысль о том, что Java-интерфейсы имеют что-то, что связано с концепцией «Программа для интерфейса, а не реализация». Они могут помочь применить концепцию, но это не концепция.

75
задан thefourtheye 4 October 2015 в 13:34
поделиться

4 ответа

Вы можете использовать Function.prototype.bind для создания новой функции со значением, переданным ее первому аргументу, например

P.then(doWork.bind(null, 'text'))

, и вы можете изменить doWork на ,

function doWork(text, data) {
  consoleToLog(data);
}

Теперь text будет фактически 'text' в doWork, а data будет значением, разрешенным обещанием.

Примечание: Пожалуйста, сделайте убедитесь, что вы прикрепляете обработчик отклонения к вашей цепочке обещаний.


Рабочая программа: Живая копия REPL для Babel

function doWork(text, data) {
  console.log(text + data + text);
}

new Promise(function (resolve, reject) {
    var a = 5;
    if (a) {
      setTimeout(function () {
        resolve(a);
      }, 3000);
    } else {
      reject(a);
    }
  })
  .then(doWork.bind(null, 'text'))
  .catch(console.error);
68
ответ дан Ben Everard 21 August 2018 в 10:47
поделиться
  • 1
    спасибо, что помогает, раньше я пытаюсь сделать doWork.call (это, «текст»), но данные были заменены на «текст», – user3110667 2 October 2015 в 17:34
  • 2
    call вызывает функцию на месте, bind создает новую функцию, однако оба принимают контекст выполнения в качестве своего первого аргумента. – sdgluck 2 October 2015 в 18:15

Lodash предлагает хорошую альтернативу для этой точной вещи.

 P.then(_.bind(doWork, 'myArgString', _));

 //Say the promise was fulfilled with the string 'promiseResults'

 function doWork(text, data) {
     console.log(text + " foo " + data);
     //myArgString foo promiseResults
 }

Или, если вы хотите, чтобы ваша функция успеха имела только один параметр (результат выполнения обещал), вы можете использовать его путь:

P.then(_.bind(doWork, {text: 'myArgString'}));

function doWork(data) {
    console.log(data + " foo " + this.text);
    //promiseResults foo myArgString
}

Это добавит text: 'myArgString' в контекст this внутри функции.

1
ответ дан JellyRaptor 21 August 2018 в 10:47
поделиться

Возможно, самый простой ответ:

P.then(function(data) { return doWork('text', data); });

Или, поскольку это помечено ecmascript-6, использование функций стрелок:

P.then(data => doWork('text', data));

Я нахожу это наиболее читаемым, и не слишком много, чтобы писать.

75
ответ дан jib 21 August 2018 в 10:47
поделиться
  • 1
    Спасибо, последнее просто красиво по сравнению с тем, что, как я думал, мне придется делать. – JollyJoker 3 May 2017 в 11:29

Использовать currying.

var P = new Promise(function (resolve, reject) {
    var a = 5;
    if (a) {
        setTimeout(function(){
            resolve(a);
        }, 3000);
    } else {
        reject(a);
    }
});

var curriedDoWork = function(text) {
    return function(data) {
        console.log(data + text);
    }
};

P.then(curriedDoWork('text'))
.catch(
    //some error handling
);
3
ответ дан yks 21 August 2018 в 10:47
поделиться
  • 1
    b осторожно с этим, если вы создадите curriedDoWork в обещание, выполнив return new Promise() в первой строке этой функции, обещание выполняется, как только вы вызываете curriedDoWork() (как вы делаете в ..then(curriedDoWork('text')) – Flame 23 March 2018 в 18:39
  • 2
    @Flame: короткий ответ, для вашего удобства вы можете поместить обещание в функцию, если вам нравится это делать. – germain 4 May 2018 в 23:41
  • 3
    @yks, вы могли бы указать этот синтаксис, который довольно интересен const curriedWork = text = & gt; data = & gt; console.log (данные + текст) – germain 4 May 2018 в 23:48
  • 4
    @germain ах да, я видел эту форму раньше, должен любить функциональное программирование. Однако я вижу, что функции стрелок разрываются в каком-то браузере, поэтому я стараюсь избегать этого. – yks 6 May 2018 в 23:43
  • 5
    @yks, только Internet Explorer не поддерживает его и никогда не будет, из-за Edge, последняя сборка Internet Explorer была 9 декабря 2015 года. Давайте перейдем к ~ – germain 8 May 2018 в 02:15
Другие вопросы по тегам:

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