Как передать параметр функции обещания


122

это может показаться глупым вопросом, но я новичок в этой теме. Я работаю над обещаниями на node js. И я хочу передать параметр функции обещания. Однако я не мог этого понять.

someModule.someFunction.then(username, password,function(uid) {
  /*stuff */
}

и функция что-то вроде

var someFunction = new Promise(username, password, function(resolve, reject) {
  /*stuff using username, password*/
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
});

1
Нет причин для этого, вы можете просто определить usernameи passwordв более высоком масштабе
adeneo

Но я вызываю обещание из другого модуля, а также имя пользователя и пароль не статичны, а исходят со стороны клиента. Безопасно ли определять какую-то глобальную переменную, которую устанавливает одна функция, а другая использует. Есть ли риск изменения переменной другим клиентом?
kundante

1
@kundante Вам не нужны глобальные переменные. Узнайте о закрытии.
SLaks

@adeneo обещание является асинхронным - что, если он вызовет функцию во второй раз до того, как будет выполнено первое обещание?
Mawg требует восстановить Монику

Ответы:


235

Оберните свой Promise внутри функции, иначе он сразу же начнет выполнять свою работу. Кроме того, вы можете передавать функции параметры:

var someFunction = function(username, password) {
  return new Promise(function(resolve, reject) {
    /*stuff using username, password*/
    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
}

Затем используйте его:

someModule.someFunction(username, password).then(function(uid) {
  /* stuff */
})

 

ES6:

const someFunction = (username, password) => {
  return new Promise((resolve, reject) => {
    /*stuff using username, password*/

    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
};

Использование:

someModule.someFunction(username, password).then(uid => {
  /* stuff */
});

что есть someModule?
Si8

3
Это просто пример из ОП
Шанур

3
@Shanoor Что такое uid? Это строка «Все сработало!»?
Old Geezer

2
@OldGeezer, это просто переменная для удержания возврата от обещания. В этом случае да, это будет «Все сработало!».
Shanoor

вы знаете, как вызвать функцию из родительского класса в новом обещании?
TimeParadox

7

Другой способ ( обязательно попробуйте ):

var promise1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});
var extraData = 'ImExtraData';
promise1.then(function(value) {
  console.log(value, extraData);
  // expected output: "Success!" "ImExtraData"
}, extraData);


2
Ваш пример будет лучше, если вы разрешите с помощью массива или объекта, который вы деконструируете, чтобы было показано несколько аргументов, и подробное обещание было создано уже разрешенным следующим образом: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465

1
Я думаю, что это неправильно, поскольку второй передаваемый параметр then- это обратный вызов для обработки возвращаемого значения функции отклонения . Вместо resolve('Success!');попытки reject('Error');Мы получим ошибку: Unhandled promise rejectionЗдесь мы видим результат, потому что var extraData = 'ImExtraData';это глобальная переменная, а НЕ из-за ее передачи с помощьюthen
Шакиба Мошири

Если вы не передадите его, вы не сможете получить к нему доступ, поскольку он не имеет области в обещании /, а затем, если вы его не передадите.
sadiq

попробовать удалить и посмотреть работает или нет? codepen.io/k-five/pen/ZNOvKG посмотрите лог консоли в своем браузере
Шакиба Мошири

Я ценю ваш код, но используйте две разные переменные, а затем посмотрите реальный фактор! ИЗБЕГАЙТЕ ОДНОЙ ПЕРЕМЕННОЙ. Если бы только глобальная переменная работала нормально, нам не нужно было бы передавать дополнительный параметр.
sadiq

1

Даже короче

var foo = (user, pass) =>
  new Promise((resolve, reject) => {
    if (/* condition */) {
      resolve("Fine");
    } else {
      reject("Error message");
    }
  });

foo(user, pass).then(result => {
  /* process */
});

0

Вы можете использовать .bind () для передачи параметра ( this ) функции.

var someFunction =function(resolve, reject) {
  /* get username, password*/
  var username=this.username;
  var password=this.password;
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
}
var promise=new Promise(someFunction.bind({username:"your username",password:"your password"}));

У меня есть эта функция, как отредактировать ее, чтобы принять, .then()когда я вызываю ее в кнопке ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Провайдер const {images} = this.state; images.map (image => {let file = image.uri; console.log (файл); const path = "Img " + Math.floor (Math.random () * 1500); console.log ("@ IMAGE" , путь); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (файл);}); }; `@gogog
DevAS,

@DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </button> сценарий: `var then_function = function (обещание) {новое обещание (обещание) .then (function (e) {/ * code * /})}; function SaveImagesToFirebase (разрешить, отклонить) {/ * code * / resolve (/ * ??? * /);} `
gogog
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.