В Java эти конкретные классы реализуют интерфейс CharSequence:
CharBuffer, String, StringBuffer, StringBuilder
blockquote>Эти конкретные классы не имеют общего родительский класс, отличный от 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
blockquote>
Вы можете использовать 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);
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
внутри функции.
Возможно, самый простой ответ:
P.then(function(data) { return doWork('text', data); });
Или, поскольку это помечено ecmascript-6
, использование функций стрелок:
P.then(data => doWork('text', data));
Я нахожу это наиболее читаемым, и не слишком много, чтобы писать.
Использовать 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
);
curriedDoWork
в обещание, выполнив return new Promise()
в первой строке этой функции, обещание выполняется, как только вы вызываете curriedDoWork()
(как вы делаете в ..then(curriedDoWork('text'))
– Flame
23 March 2018 в 18:39
call
вызывает функцию на месте,bind
создает новую функцию, однако оба принимают контекст выполнения в качестве своего первого аргумента. – sdgluck 2 October 2015 в 18:15