Подтвердить что ты не робот

Promises, передать дополнительные параметры для последующей цепи

например,

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, чтобы получить доступ к данным с обещанием и параметром текста? если есть какие-то трюки? спасибо.

4b9b3361

Ответ 1

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

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

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

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

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

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


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

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);

Ответ 2

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

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

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

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

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

Ответ 3

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 внутри функции.

Ответ 4

Используйте 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
);