คำถามติดแท็ก bluebird

Bluebird เป็นไลบรารีสัญญาที่มีคุณลักษณะครบถ้วนสำหรับ JavaScript ไคลเอนต์และเซิร์ฟเวอร์โดยมุ่งเน้นที่คุณสมบัติและประสิทธิภาพที่เป็นนวัตกรรมใหม่

19
ฉันจะแปลง API การเรียกกลับที่มีอยู่เป็นสัญญาได้อย่างไร
ฉันต้องการทำงานกับคำสัญญา แต่ฉันมี callback API ในรูปแบบดังนี้: 1. โหลด DOM หรือเหตุการณ์ครั้งเดียวอื่น ๆ : window.onload; // set to callback ... window.onload = function() { }; 2. โทรกลับธรรมดา: function request(onChangeHandler) { ... } request(function() { // change happened ... }); 3. การเรียกกลับสไตล์โหนด ("nodeback"): function getStuff(dat, callback) { ... } getStuff("dataParam", function(err, data) { ... …

17
ฉันจะเข้าถึงผลลัพธ์ของสัญญาก่อนหน้านี้ในห่วงโซ่แล้ว. () ได้อย่างไร
ฉันได้ปรับโครงสร้างรหัสของฉันให้เป็นสัญญาและสร้างห่วงโซ่สัญญาที่มีความยาวอันยอดเยี่ยมซึ่งประกอบด้วยการ.then()เรียกกลับหลายครั้ง ในที่สุดผมต้องการที่จะกลับบางค่าคอมโพสิตและจำเป็นที่จะต้องเข้าถึงหลายผลสัญญากลาง อย่างไรก็ตามค่าความละเอียดจากจุดกึ่งกลางของลำดับไม่อยู่ในขอบเขตในการโทรกลับครั้งล่าสุดฉันจะเข้าถึงได้อย่างไร function getExample() { return promiseA(…).then(function(resultA) { // Some processing return promiseB(…); }).then(function(resultB) { // More processing return // How do I gain access to resultA here? }); }

2
Antipattern สัญญาก่อสร้างที่ชัดเจนคืออะไรและฉันจะหลีกเลี่ยงได้อย่างไร
ฉันกำลังเขียนโค้ดที่ทำสิ่งที่ดูเหมือน: function getStuffDone(param) { | function getStuffDone(param) { var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) { // or = new $.Deferred() etc. | // using a promise constructor myPromiseFn(param+1) | myPromiseFn(param+1) .then(function(val) { /* or .done */ | .then(function(val) { d.resolve(val); | resolve(val); }).catch(function(err) …

10
ไม่ได้สัญญาไว้เพียงแค่โทรกลับ
ฉันพัฒนา JavaScript มาหลายปีแล้วและฉันก็ไม่เข้าใจว่าสัญญาจะเกิดอะไรขึ้น ดูเหมือนว่าทั้งหมดที่ฉันทำคือการเปลี่ยนแปลง: api(function(result){ api2(function(result2){ api3(function(result3){ // do work }); }); }); ซึ่งฉันสามารถใช้ห้องสมุดเช่นasyncสำหรับต่อไปกับสิ่งที่ชอบ api().then(function(result){ api2().then(function(result2){ api3().then(function(result3){ // do work }); }); }); รหัสไหนมากกว่าและอ่านได้น้อยกว่า ฉันไม่ได้อะไรเลยนี่มันไม่ได้ 'แบน' อย่างน่าอัศจรรย์ ไม่ต้องพูดถึงต้องเปลี่ยนสิ่งต่าง ๆ เพื่อสัญญา ดังนั้นเอะอะใหญ่เกี่ยวกับสัญญาที่นี่คืออะไร?


1
ยังมีเหตุผลที่จะใช้ห้องสมุดสัญญาเช่น Q หรือ BlueBird ตอนนี้ที่เรามีสัญญา ES6 หรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ปรับปรุงคำถามนี้ หลังจาก Node.js เพิ่มการสนับสนุนแบบเนทีฟสำหรับคำสัญญาแล้วยังมีเหตุผลที่จะใช้ห้องสมุดอย่าง Q หรือ BlueBird หรือไม่? ตัวอย่างเช่นหากคุณกำลังเริ่มโครงการใหม่และสมมติว่าในโครงการนี้คุณไม่มีการอ้างอิงใด ๆ ที่ใช้ไลบรารีเหล่านี้เราสามารถพูดได้หรือไม่ว่าไม่มีเหตุผลที่จะใช้ไลบรารีดังกล่าวอีกต่อไป?

7
เมื่อใดจึงจะถือว่าเป็นปฏิปักษ์ต่อคำสัญญา?
ฉันได้ดูที่สัญญาคำถามที่พบบ่อยนกชนิดหนึ่งในสิ่งที่มันกล่าวว่า.then(success, fail)เป็น antipattern ฉันไม่ค่อยเข้าใจคำอธิบายสำหรับลองและจับ เกิดอะไรขึ้นกับสิ่งต่อไปนี้ some_promise_call() .then(function(res) { logger.log(res) }, function(err) { logger.log(err) }) ดูเหมือนว่าตัวอย่างจะแนะนำสิ่งต่อไปนี้เป็นวิธีที่ถูกต้อง some_promise_call() .then(function(res) { logger.log(res) }) .catch(function(err) { logger.log(err) }) ความแตกต่างคืออะไร?

1
ฟังก์ชัน util.toFastProperties ของ Bluebird ทำให้คุณสมบัติของวัตถุ“ เร็ว” อย่างไร
ในutil.jsไฟล์ของ Bluebird มันมีฟังก์ชั่นดังต่อไปนี้: function toFastProperties(obj) { /*jshint -W027*/ function f() {} f.prototype = obj; ASSERT("%HasFastProperties", true, obj); return f; eval(obj); } ด้วยเหตุผลบางอย่างมีคำสั่งหลังจากฟังก์ชันส่งคืนซึ่งฉันไม่แน่ใจว่าทำไมถึงมี เช่นกันดูเหมือนว่าเป็นเรื่องที่ไตร่ตรองอย่างที่ผู้เขียนได้ทำการเตือน JSHint เกี่ยวกับเรื่องนี้: เข้าไม่ถึง 'eval' หลังจาก 'return' (W027) ฟังก์ชันนี้ทำหน้าที่อะไรกันแน่? ไม่util.toFastPropertiesจริงๆทำให้คุณสมบัติของวัตถุ "เร็วขึ้น"? ฉันค้นหาที่เก็บข้อมูล GitHub ของ Bluebird สำหรับความคิดเห็นใด ๆ ในซอร์สโค้ดหรือคำอธิบายในรายการปัญหาของพวกเขา แต่ฉันไม่พบอะไรเลย

7
การจัดการการจับหลายครั้งในห่วงโซ่สัญญา
ฉันยังค่อนข้างใหม่สำหรับสัญญาและกำลังใช้ bluebird อยู่ในขณะนี้ แต่ฉันมีสถานการณ์ที่ฉันไม่แน่ใจว่าจะจัดการกับมันอย่างไรดีที่สุด ตัวอย่างเช่นฉันมีห่วงโซ่สัญญาภายในแอปด่วนดังนี้: repository.Query(getAccountByIdQuery) .catch(function(error){ res.status(404).send({ error: "No account found with this Id" }); }) .then(convertDocumentToModel) .then(verifyOldPassword) .catch(function(error) { res.status(406).send({ OldPassword: error }); }) .then(changePassword) .then(function(){ res.status(200).send(); }) .catch(function(error){ console.log(error); res.status(500).send({ error: "Unable to change password" }); }); ดังนั้นพฤติกรรมที่ฉันตามคือ: ไปรับบัญชีด้วย Id หากมีการปฏิเสธ ณ จุดนี้ให้ทิ้งระเบิดและส่งคืนข้อผิดพลาด หากไม่มีข้อผิดพลาดในการแปลงเอกสารกลับไปเป็นแบบจำลอง ตรวจสอบรหัสผ่านด้วยเอกสารฐานข้อมูล หากรหัสผ่านไม่ตรงกันให้ทิ้งระเบิดและส่งคืนข้อผิดพลาดอื่น หากไม่มีข้อผิดพลาดให้เปลี่ยนรหัสผ่าน …

13
วิธีที่ถูกต้องในการเขียนลูปสำหรับสัญญา
วิธีสร้างลูปอย่างถูกต้องเพื่อให้แน่ใจว่าการเรียกคำสัญญาต่อไปนี้และlogger.log (res) ที่ถูกล่ามโซ่ทำงานพร้อมกันผ่านการวนซ้ำ? (คราม) db.getUser(email).then(function(res) { logger.log(res); }); // this is a promise ฉันลองทำตามวิธีต่อไปนี้ (วิธีจากhttp://blog.victorquinn.com/javascript-promise- while-loop ) var Promise = require('bluebird'); var promiseWhile = function(condition, action) { var resolver = Promise.defer(); var loop = function() { if (!condition()) return resolver.resolve(); return Promise.cast(action()) .then(loop) .catch(resolver.reject); }; process.nextTick(loop); return resolver.promise; }); var …

2
ตำแหน่งของการจับก่อนและหลังนั้น
ฉันมีปัญหาในการทำความเข้าใจความแตกต่างระหว่างการใส่.catchก่อนและหลังในสัญญาซ้อนกัน ทางเลือกที่ 1: test1Async(10).then((res) => { return test2Async(22) .then((res) => { return test3Async(100); }).catch((err) => { throw "ERROR AFTER THEN"; }); }).then((res) => { console.log(res); }).catch((err) => { console.log(err); }); ทางเลือกที่ 2: test1Async(10).then((res) => { return test2Async(22) .catch((err) => { throw "ERROR BEFORE THEN"; }) .then((res) => { return test3Async(100); …

2
Promise.resolve vs New Promise (แก้ไข)
ฉันใช้ bluebird และฉันเห็นสองวิธีในการแก้ไขฟังก์ชันซิงโครนัสให้เป็น Promise แต่ฉันไม่เข้าใจความแตกต่างระหว่างทั้งสองวิธี ดูเหมือนว่า stacktrace จะแตกต่างกันเล็กน้อยดังนั้นจึงไม่ใช่แค่ an aliasใช่ไหม? แล้ววิธีที่ต้องการคืออะไร? ทางก function someFunction(someObject) { return new Promise(function(resolve) { someObject.resolved = true; resolve(someObject); }); } ทาง B function someFunction(someObject) { someObject.resolved = true; return Promise.resolve(someObject); }

8
การแทนที่การโทรกลับด้วยคำสัญญาใน Node.js
ฉันมีโมดูลโหนดอย่างง่ายที่เชื่อมต่อกับฐานข้อมูลและมีฟังก์ชันต่างๆในการรับข้อมูลตัวอย่างเช่นฟังก์ชันนี้: dbConnection.js: import mysql from 'mysql'; const connection = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password', database: 'db' }); export default { getUsers(callback) { connection.connect(() => { connection.query('SELECT * FROM Users', (err, result) => { if (!err){ callback(result); } }); }); } }; โมดูลจะถูกเรียกด้วยวิธีนี้จากโมดูลโหนดอื่น: app.js: import dbCon from './dbConnection.js'; dbCon.getUsers(console.log); …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.