ฉันจะทำให้สัญญา JavaScript ส่งคืนสิ่งอื่นนอกเหนือจากสัญญาได้อย่างไร


36

ฉันมีสเป็คจากลูกค้าสำหรับการใช้วิธีการในโมดูล:

 // getGenres():
 //  Returns a promise. When it resolves, it returns an array.

หากได้รับแนวของประเภท

['comedy', 'drama', 'action']

นี่คือวิธีโครงกระดูกพร้อมสัญญา:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
  });

  return promise;
};

สัญญาสามารถส่งคืนข้อมูลที่พบในประเภทได้หรือไม่? มีวิธีที่ดีกว่าเพื่อให้บรรลุคำอธิบายข้อมูลจำเพาะหรือไม่


8
สัญญาไม่ได้ "คืนค่า" พวกเขาส่งพวกเขาไปยังการโทรกลับ (ซึ่งคุณให้กับ. แล้ว ()) สเป็คก็ฟังดูสับสนแล้วสำหรับฉัน อาจพยายามที่จะบอกว่าคุณควรทำresolve([genre1, genre2, ...]);ตามสัญญาที่ให้ไว้
Ixrec

คำตอบ:


37

ดูเหมือนคุณจะไม่เข้าใจว่าจะใช้สัญญาอย่างไร คุณคืนสัญญา จากนั้นเมื่อรหัสของคุณแก้ไขสัญญามันจะแก้ไขด้วยผลลัพธ์และผลลัพธ์นั้นจะถูกส่งไปยัง.then()ตัวจัดการที่แนบกับสัญญา

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
    resolve(result);
  });

  return promise;
};

MovieLibrary.getGenres().then(function(result) {
    // you can access the result from the promise here
});

5
สิ่งนี้เป็นการยืนยันว่าสัญญานั้นเป็นไปตามที่ฉันคาดไว้
sealocal

อาจเป็นไปได้ว่าคุณไม่เข้าใจว่าทำไมถึงมีความจำเป็น ในสภาพแวดล้อมเช่น React Native with Redux กับ Realm ฉันต้องใส่สถานะเริ่มต้นไปที่ Redux createStore ควรดึงข้อมูลจากอาณาจักร แต่ส่งคืนสัญญา ฉันต้องการบล็อกจนกว่าจะส่งคืนข้อมูลเนื่องจากควรจะรวดเร็วและง่ายมาก แต่ฉันได้รับปัญหาวิธีการรวมอาณาจักรสัญญาและวัตถุ JSON ปกติสำหรับ createStore ()
เหมือน

24

รุ่นที่ปรับปรุงโดยใช้มากกว่าawait.then()

awaitหยุดดำเนินการจนกว่าสัญญาจะได้รับการแก้ไข ต่างจากการใช้.then()คุณสามารถเก็บawaitค่าไอเอ็นจีในขณะที่คุณทำสิ่งต่าง ๆ ที่ส่งคืนสัญญาและดำเนินการต่อไปยังบรรทัดถัดไป (ซึ่งเรียกว่า 'สไตล์โดยตรง) นอกจากนี้ยังมีมากดีกว่าที่จะมองเพราะมันสอดคล้องกับส่วนที่เหลือของ JavaScript กว่า.then()ทุกที่

// Example function that returns a Promise that will resolve after 2 seconds
var getGenres = function() {
  return new Promise(function(resolve) {
    setTimeout(function(){
      resolve(['comedy', 'drama', 'action'])
    }, 2000);
  });
}

// We start an 'async' function to use the 'await' keyword
(async function(){
  var result = await getGenres()
  console.log('Woo done!', result)

  // But the best part is, we can just keep awaiting different stuff, without ugly .then()s
  var somethingElse = await getSomethingElse()
  var moreThings = await getMoreThings()
})()

รอคอยได้รับการสนับสนุนในเบราว์เซอร์และโหนดปัจจุบันทั้งหมด


1
โอ้ว้าวววดูคำถาม 3 ข้อเกี่ยวกับเรื่องนี้และในที่สุดเราก็มีคำตอบที่แท้จริง!
แอนดรู
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.