パラメーターをpromise関数に渡す方法


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
そうする理由はあなただけ定義することができ、ありませんusernameし、password高い範囲で
adeneo

しかし、私は別のモジュールからpromiseを呼び出しています。また、ユーザー名とパスワードは静的ではなく、クライアント側からのものです。1つの関数が設定してもう1つの関数が使用する何らかの種類のグロバル変数を定義しても安全ですか?変数が別のクライアントによって変更されるリスクはありますか?
クンダンテ2016

1
@kundanteグローバルは必要ありません。クロージャーについて学ぶ。
SLaks 2016

@adeneo約束は非同期です-最初の約束が解決される前にもう一度関数を呼び出すとどうなりますか?
Mawgはモニカを

回答:


233

関数内にプロミスをラップするか、すぐにその仕事を始めます。さらに、関数にパラメーターを渡すことができます。

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、2018年

3
これはOPの例にすぎません
Shanoor

3
@Shanoorとは何uidですか?「スタッフはうまくいった!」という文字列ですか?
Old Geezer

2
@OldGeezer、それは約束からのリターンを保持するための単なる変数です。この場合、はい、それは「スタッフは働いた!」でしょう。
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 2018年

1
渡される2番目のパラメータthenリジェクト関数の戻り値を処理するためのコールバックなので間違っていると思います。resolve('Success!');試行する代わりに、reject('Error');エラーが発生します。Unhandled promise rejectionここでvar extraData = 'ImExtraData';は、がグローバル変数であり、それを使用して渡すためではないため、出力が表示されますthen
Shakiba Moshiri

渡さない場合はpromiseにスコープがないため、アクセスできません。
sadiq

それを削除してみて、機能するかどうかを確認してください。codepen.io/k-five/pen/ZNOvKGブラウザーでコンソールログを確認
Shakiba Moshiri

私はコードペンに感謝しますが、2つの異なる変数を使用してから、実際の要因を確認してください!同じ変数を避けてください。グローバル変数のみが正常に機能した場合、追加のパラメーターを渡す必要はありませんでした。
sadiq

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()ボタンで呼び出したときに受け入れるように編集する方法をこの関数に持っています` 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(provider/${uid}/ProviderGalary/${path}). ref(); ref.put(file);}); }; `@gogog
DevAS

@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.