프라 미스 함수에 매개 변수를 전달하는 방법


122

이것은 어리석은 질문처럼 보일지 모르지만 나는이 주제의 초보자입니다. 노드 js에 대한 약속 작업 중입니다. 그리고 매개 변수를 promise 함수에 전달하고 싶습니다. 그러나 나는 그것을 알아낼 수 없었다.

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
그렇게하는 이유는 당신은 정의 할 수 없습니다 usernamepassword높은 범위
adeneo

그러나 나는 다른 모듈에서 promise를 호출하고 있으며 사용자 이름과 암호는 정적이 아니라 클라이언트 측에서 오는 것입니다. 한 함수가 설정하고 다른 함수가 사용하는 일종의 gloabal 변수를 정의하는 것이 안전합니까? 다른 클라이언트가 변수를 변경할 위험이 있습니까?
kundante

1
@kundante 전역이 필요하지 않습니다. 폐쇄에 대해 알아보십시오.
SLaks

@adeneo 약속은 비동기입니다. 첫 번째 약속이 해결되기 전에 두 번째로 함수를 호출하면 어떨까요?
Mawg는 분석 재개 모니카 말한다

답변:


234

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
OP의
예일뿐입니다

3
@Shanoor 무엇입니까 uid? "Stuff works!"문자열입니까?
Old Geezer

2
@OldGeezer, 약속의 수익을 유지하는 변수 일뿐입니다. 이 경우에는 "Stuff works!"가됩니다.
Shanoor

새로운 promise 내에서 부모 클래스에서 함수를 호출하는 방법을 알고 있습니까?
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';A는 글로벌 때문에 사용하여 전달하는 변수 및 NOTthen
Shakiba Moshiri을

전달하지 않으면 약속 범위가 없으므로 액세스 할 수 없으며 전달하지 않으면 액세스 할 수 없습니다.
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 ()를 사용하여 param ( 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()는 Button에서 호출 할 때 수락하도록 편집하는 방법이 있습니다 .`SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // 제공자 const {이미지} = this.state; images.map (image => {let file = image.uri; console.log (file); const path = "Img "+ Math.floor (Math.random () * 1500); console.log ( "@ IMAGE" , 경로); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (file);}); };`@gogog
신들

@DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </ button> 스크립트는`var then_function = function (promise) {new Promise (promise) .then (function (e) {/ * code *)입니다. /})}; function SaveImagesToFirebase (resolve, reject) {/ * code * / resolve (/ * ??? * /);}`
gogog
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.