Як передати параметр функції обіцянки


122

це може здатися дурним питанням, але я новачок у цій темі. Я працюю над обіцянками на вузлі 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в більш
широкому

Але я дзвоню обіцянку з іншого модуля, а також ім’я користувача та пароль не є статичними, а надходять від клієнта. Чи безпечно визначити деякий вид змінної gloabal, який одна функція встановлює, а інша використовує. Чи існує ризик зміни змінної іншим клієнтом?
кунданте

1
@kundante Глобали не потрібні. Дізнайтеся про закриття.
Слакс

@adeneo обіцянка є асинхронною - що робити, якщо він запускає функцію вдруге, перш ніж перша обіцянка буде вирішена?
Мауг каже, що повернемо Моніку

Відповіді:


234

Загорніть обіцянку всередину функції, інакше вона відразу почне виконувати свою роботу. Крім того, ви можете передавати параметри функції:

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? Це рядок "Stuff працював!"?
Old Geezer

2
@OldGeezer, це просто змінна, щоб утримати віддачу від обіцянки. У цьому випадку, так, це було б "Речі працювали!".
Шанур

чи знаєте ви, як викликати функцію з батьківського класу в межах нової обіцянки?
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]);
користувач5389726598465

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

Якщо ви не передаєте його, ви не зможете отримати доступ до нього, оскільки він не має обіцянки / тоді, якщо ви не передасте його.
sadiq

спробуйте його видалити і побачити, працює він чи ні? codepen.io/k-five/pen/ZNOvKG дивіться у своєму браузері журнал консолі
Shakiba Moshiri

Я ціную ваш кодпен, але використовуйте дві різні змінні, а потім побачите реальний фактор! УНИЖНІТЬ ІНШУ ВІДМІННУ. Якщо просто глобальна змінна спрацювала нормально, нам не потрібно було передавати додатковий параметр.
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 (), щоб передати парам ( цей ) функції.

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 <кнопка onclick = "then_function (SaveImagesToFirebase.bind (this))"> </button> скрипт `var then_function = функція (обещання) {new Promise (obeation) .then (function (e) {/ * code * /})}; функція SaveImagesToFirebase (вирішити, відхилити) {/ * код * / вирішити (/ * ??? * /);} `
gogog
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.