วิธีการส่งพารามิเตอร์ไปยังฟังก์ชันสัญญา


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อยู่ในขอบเขตที่สูงขึ้นได้
adeneo

แต่ฉันกำลังเรียกสัญญาจากโมดูลอื่นและชื่อผู้ใช้และรหัสผ่านก็ไม่คงที่ แต่มาจากฝั่งไคลเอ็นต์ ปลอดภัยหรือไม่ที่จะกำหนดตัวแปร gloabal ที่ฟังก์ชันหนึ่งตั้งค่าและอีกฟังก์ชันหนึ่งใช้ มีความเสี่ยงที่ลูกค้ารายอื่นจะเปลี่ยนตัวแปรหรือไม่?
kundante

1
@kundante คุณไม่จำเป็นต้องมีลูกโลก เรียนรู้เกี่ยวกับการปิด
SLaks

@adeneo สัญญาจะไม่ตรงกัน - จะเกิดอะไรขึ้นถ้าเขาเรียกใช้ฟังก์ชันเป็นครั้งที่สองก่อนที่คำสัญญาแรกจะได้รับการแก้ไข
Mawg กล่าวว่าคืนสถานะ Monica

คำตอบ:


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
เป็นเพียงตัวอย่างจาก OP
Shanoor

3
@ Shanoor คืออะไรuid? มันคือสตริง "Stuff works!"?
Old Geezer

2
@OldGeezer เป็นเพียงตัวแปรในการยึดเอาผลตอบแทนจากคำสัญญา ในกรณีนี้ใช่ว่าจะเป็น "Stuff works!"
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
ตัวอย่างของคุณจะดีกว่าถ้าคุณแก้ปัญหาด้วยอาร์เรย์หรืออ็อบเจกต์ที่คุณแยกโครงสร้างเพื่อให้มีการแสดงอาร์กิวเมนต์หลายรายการและคำสัญญา verbose ถูกสร้างขึ้นแล้วได้รับการแก้ไขดังนี้: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465

1
ฉันคิดว่ามันไม่ถูกต้องเนื่องจากพารามิเตอร์ที่สองซึ่งถูกส่งไปยังthenเป็นการเรียกกลับสำหรับจัดการค่าส่งคืนของฟังก์ชันการปฏิเสธ แทนที่จะresolve('Success!');ลองreject('Error');เราจะได้รับข้อผิดพลาด: ที่Unhandled promise rejectionนี่เราเห็นผลลัพธ์เนื่องจากvar extraData = 'ImExtraData';เป็นตัวแปรส่วนกลางและไม่ใช่เพราะการส่งผ่านโดยใช้then
Shakiba Moshiri

หากคุณไม่ผ่านคุณจะไม่สามารถเข้าถึงได้เนื่องจากไม่มีขอบเขตตามสัญญา / ถ้าคุณไม่ผ่าน
sadiq

ลองถอดออกดูว่าใช้งานได้หรือไม่? codepen.io/k-five/pen/ZNOvKGดูบันทึกคอนโซลในเบราว์เซอร์ของคุณ
Shakiba Moshiri

ขอขอบคุณ codepen ของคุณ แต่ใช้สองตัวแปรที่แตกต่างกันแล้วดูปัจจัยที่แท้จริง! หลีกเลี่ยงตัวแปรเดียวกัน หากเพียงแค่ตัวแปรส่วนกลางทำงานได้ดีเราก็ไม่จำเป็นต้องส่งผ่านพารามิเตอร์เพิ่มเติม
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 (รูปภาพ => {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 ใหม่ (สัญญา) แล้ว (function (e) {/ * code * /})}; ฟังก์ชัน SaveImagesToFirebase (แก้ไขปฏิเสธ) {/ * code * / แก้ไข (/ * ??? * /);} `
gogog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.