Как передать аргумент getJSON.then обработчику ответа? [Дубликат]

В Java эти конкретные классы реализуют интерфейс CharSequence:

CharBuffer, String, StringBuffer, StringBuilder

Эти конкретные классы не имеют общего родительский класс, отличный от Object, поэтому нет ничего, что связывало бы их, кроме того, что каждый из них имеет какое-то отношение к массивам символов, представляющих такие или манипулирующие такими. Например, символы String не могут быть изменены после создания экземпляра объекта String, тогда как символы StringBuffer или StringBuilder могут быть отредактированы.

Однако каждый из этих классов способен соответствующим образом реализовать методы интерфейса CharSequence :

char charAt(int index)
int length()
CharSequence subSequence(int start, int end)
String toString()

В некоторых случаях классы классов классов Java, которые использовали для приема String, были пересмотрены, чтобы теперь принять интерфейс CharSequence. Поэтому, если у вас есть экземпляр StringBuilder, вместо извлечения объекта String (что означает создание экземпляра нового объекта) вместо этого можно просто передать сам StringBuilder, поскольку он реализует интерфейс CharSequence.

Добавляемый интерфейс, который некоторые классы реализуют такую ​​же выгоду для любой ситуации, когда символы могут быть добавлены к экземпляру конкретного конкретного экземпляра объекта класса. Все эти конкретные классы реализуют интерфейс Appendable:

BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer

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 20 August 2018 в 17:59
поделиться
  • 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 20 August 2018 в 17:59
поделиться

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

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

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

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

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

75
ответ дан jib 20 August 2018 в 17:59
поделиться
  • 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 20 August 2018 в 17:59
поделиться
  • 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
Другие вопросы по тегам:

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