Обещание, например:
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
После вызова метод в обещании:
P.then(doWork('text'));
Функция doWork выглядит так:
function doWork(data) {
return function(text) {
// sample function to console log
consoleToLog(data);
consoleToLog(b);
}
}
Как я могу избежать возврата внутренней функции в doWork, чтобы получить доступ к данным из обещания и текстовых параметров? Есть ли какие-нибудь уловки, чтобы избежать внутренней функции?
javascript
promise
ecmascript-6
es6-promise
user3110667
источник
источник
bind
метод? - что также очень медленно.Ответы:
Вы можете использовать
Function.prototype.bind
для создания новой функции со значением, переданным ее первому аргументу, напримери вы можете изменить
doWork
на,Теперь
text
будет фактически'text'
вdoWork
иdata
будет значение, разрешенное Promise.Примечание. Убедитесь, что вы прикрепили обработчик отклонения к цепочке обещаний.
Рабочая программа: Живая копия на Вавилонском REPL
источник
call
вызывает функцию на месте,bind
создает новую функцию, однако оба принимают контекст выполнения в качестве своего первого аргумента.Возможно, самый простой ответ:
Или, поскольку это помечено
ecmascript-6
, с помощью стрелочных функций:Я считаю это наиболее читаемым, и писать не так уж много.
источник
Используйте каррирование.
источник
curriedDoWork
обещание, выполняяreturn new Promise()
в первой строке этой функции, обещание выполняется, как только вы вызываетеcurriedDoWork()
(как вы это делаете в..then(curriedDoWork('text'))
Lodash предлагает прекрасную альтернативу именно этому.
Или, если вы хотите, чтобы ваша функция успеха имела только один параметр (результаты выполненного обещания), вы можете использовать его следующим образом:
Это будет связано
text: 'myArgString'
сthis
контекстом внутри функции.источник
Новый ответ на этот вопрос - использовать стрелочные функции, которые автоматически привязывают this и более удобочитаемы. Google для таких ссылок, как: https://2ality.com/2016/02/arrow-functions-vs-bind.html
Вы можете установить текст следующим образом: this.text = 'text' P.then (data => doWork (data)); //this.text внутри doWork будет оцениваться как 'text'.
Об этом свидетельствует указанная выше строчка, и этот (или такой!) Теперь должен быть принятым ответом.
источник