Promise: как передать функцию с параметрами?

В следующем тестовом коде я пытаюсь передать предопределенную функцию с параметрами (т. е. t2, t3) в then. Но он жалуется, что "r" не определено.

var Promise = require('bluebird');

var t2 = function(r) {
    console.log("2r: " + r);
    return 2 * r;
};

var t3 = function(r) {
    console.log("3r: " + r);
    return 3 * r;
};

new Promise(function(resolve, reject) {

    setTimeout(function() {
        resolve(1);
        reject(2)
    }, 1000);
})
.then(t2(r), t3(r))
.then(t2(r), t3(r))
.then(t2(r), t3(r));

person user180574    schedule 04.08.2018    source источник


Ответы (2)


Вместо этого просто передайте имена функций:

var t2 = function(r) {
  console.log("2r: " + r);
  return 2 * r;
};

var t3 = function(r) {
  console.log("3r: " + r);
  return 3 * r;
};

new Promise(function(resolve, reject) {

    setTimeout(function() {
      resolve(1);
      reject(2)
    }, 1000); // (*)

  })
  .then(t2, t3)
  .then(t2, t3)
  .then(t2, t3);

Если вы на самом деле хотите передать дополнительные параметры, которые вам известны заранее, создайте t2 и t3 функции более высокого порядка, которые возвращают > функции, чтобы вы могли вызывать их внутри списка параметров .then:

var t2 = extra => r => {
  console.log("2r: " + r);
  console.log('extra param: ' + extra);
  return 2 * r;
};

var t3 = extra => r => {
  console.log("3r: " + r);
  console.log('extra param: ' + extra);
  return 3 * r;
};


const r = 'foo';
new Promise(function(resolve, reject) {

    setTimeout(function() {
      resolve(1);
      reject(2)
    }, 1000); // (*)

  })
  .then(t2(r), t3(r))
  .then(t2(r), t3(r))
  .then(t2(r), t3(r));

person CertainPerformance    schedule 04.08.2018

Вы не передаете r функциям. .then передает значение обратному вызову.

new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve(1)
    reject(2)
  })
})
.then((r) => /* do stuff with r here */)

Если вам нужно вывести результаты из системы, у вас будет что-то вроде .then((r) => { t2(r); t3(r); }). Если вам просто нужно вернуть результат функции умножения (или чего-то еще), .then(t2) будет работать (для одной функции). Обратите внимание, что здесь я использую стрелочные функции; теперь они работают в Node и большинстве браузеров, но вместо этого вы можете использовать ключевое слово function, если хотите.

Вы также странно используете здесь оператор запятой - помните, это в основном то же самое, что иметь оператор и затем возврат, и поскольку ваши функции не выполняют никаких изменений (только log побочный эффект ), вы на самом деле не собираетесь влиять на какие-либо данные с помощью первой функции в каждом .then.

person Zac Anger    schedule 04.08.2018