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

สัญญาเป็นกลยุทธ์สำหรับการคำนวณรอตัดบัญชีเหมาะสำหรับหลายรูปแบบของการเกิดพร้อมกัน: เธรดและการวนรอบเหตุการณ์พร้อมกันสำหรับการคำนวณในเครื่องและการส่งข้อความระยะไกลแบบซิงโครนัสและแบบอะซิงโครนัส คำมั่นสัญญาหมายถึงผลลัพธ์ในที่สุดของการดำเนินการแบบอะซิงโครนัส วิธีหลักในการทำงานกับสัญญาคือวิธีการที่ลงทะเบียนการเปลี่ยนแปลงจากมูลค่าในที่สุดของสัญญาหรือเหตุผลความล้มเหลวเป็นสัญญาใหม่

4
ฉันจะทดสอบสัญญาอย่างถูกต้องกับมอคค่าและชัยได้อย่างไร
การทดสอบต่อไปนี้ทำงานผิดปกติ: it('Should return the exchange rates for btc_ltc', function(done) { var pair = 'btc_ltc'; shapeshift.getRate(pair) .then(function(data){ expect(data.pair).to.equal(pair); expect(data.rate).to.have.length(400); done(); }) .catch(function(err){ //this should really be `.catch` for a failed request, but //instead it looks like chai is picking this up when a test fails done(err); }) }); ฉันจะจัดการสัญญาที่ถูกปฏิเสธได้อย่างไร (และทดสอบ) ฉันควรจัดการกับการทดสอบที่ล้มเหลวได้อย่างไร …
148 node.js  promise  mocha  chai 

9
ทำความเข้าใจกับคำสัญญาใน Node.js
จากสิ่งที่ฉันเข้าใจมีสามวิธีในการเรียกใช้โค้ดอะซิงโครนัส: กิจกรรมเช่น request.on("event", callback); การโทรกลับเช่น fs.open(path, flags, mode, callback); สัญญา ฉันพบไลบรารี่สัญญาโหนดแต่ไม่เข้าใจ ใครช่วยอธิบายเกี่ยวกับสัญญาได้บ้างและทำไมฉันถึงควรใช้มัน ทำไมมันถูกลบออกจาก Node.js

3
ความแตกต่างระหว่าง microtask และ macrotask ภายในบริบทของเหตุการณ์
ฉันเพิ่งอ่านข้อกำหนด Promises / A + เสร็จแล้วและสะดุดกับคำว่า microtask และ macrotask: ดูที่http://promisesaplus.com/#notes ฉันไม่เคยได้ยินคำศัพท์เหล่านี้มาก่อนและตอนนี้ฉันสงสัยว่าความแตกต่างคืออะไร? ฉันพยายามค้นหาข้อมูลบางอย่างบนเว็บแล้ว แต่ทั้งหมดที่ฉันพบคือโพสต์นี้จากคลังเก็บ w3.org (ซึ่งไม่ได้อธิบายความแตกต่างให้ฉัน): http://lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html นอกจากนี้ฉันพบโมดูล npm ที่เรียกว่า "macrotask": https://www.npmjs.org/package/macrotask อีกครั้งยังไม่มีการชี้แจงว่าความแตกต่างคืออะไรกันแน่ สิ่งที่ฉันรู้ก็คือมันมีบางอย่างเกี่ยวข้องกับการวนซ้ำของเหตุการณ์ดังที่อธิบายไว้ในhttps://html.spec.whatwg.org/multipage/webappapis.html#task-queue และhttps: //html.spec.whatwg .org / multipage / webappapis.html # perform-a-microtask-จุดตรวจ ฉันรู้ว่าในทางทฤษฎีฉันควรจะสามารถดึงความแตกต่างออกมาได้ด้วยตัวเองตามข้อกำหนด WHATWG นี้ แต่ฉันแน่ใจว่าคนอื่น ๆ ก็อาจได้รับประโยชน์เช่นกันจากคำอธิบายสั้น ๆ ที่ผู้เชี่ยวชาญให้มา

12
จะเข้าถึงคุณค่าของสัญญาได้อย่างไร?
ฉันกำลังดูตัวอย่างนี้จากเอกสารของ Angular $qแต่ฉันคิดว่านี่อาจใช้กับสัญญาโดยทั่วไป ตัวอย่างด้านล่างนี้ถูกคัดลอกคำต่อคำจากเอกสารโดยมีความคิดเห็นรวมอยู่ด้วย: promiseB = promiseA.then(function(result) { return result + 1; }); // promiseB will be resolved immediately after promiseA is resolved and its value // will be the result of promiseA incremented by 1 ฉันไม่ชัดเจนว่ามันใช้งานได้อย่างไร ถ้าผมสามารถเรียก.then()ผลการใช้ครั้งแรก.then(), ผูกมัดพวกเขาซึ่งฉันรู้ว่าฉันสามารถแล้วเป็นวัตถุสัญญาประเภทpromiseB มันไม่ได้เป็นObject Numberดังนั้นสิ่งที่พวกเขาหมายถึงโดย "คุณค่าของมันจะเป็นผลมาจากสัญญาเพิ่มขึ้น 1"? ฉันควรจะเข้าถึงสิ่งที่เป็นpromiseB.valueหรืออะไรแบบนั้น? การติดต่อกลับสำเร็จจะส่งคืนสัญญาและส่งคืน "ผลลัพธ์ + 1" ได้อย่างไร ฉันคิดถึงบางอย่าง

22
typescript: error TS2693: 'Promise' อ้างถึงประเภทเท่านั้น แต่มีการใช้เป็นค่าที่นี่
ฉันกำลังพยายามใช้ typescript สำหรับ AWS Lambda ของฉันและฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันใช้สัญญา ข้อผิดพลาด TS2693: 'สัญญา' หมายถึงประเภทเท่านั้น แต่มีการใช้เป็นค่าที่นี่ ฉันลองใช้รูปแบบต่าง ๆ ต่อไปนี้ในรหัส ใช้คอนสตรัคสัญญา responsePromise = new Promise((resolve, reject) => { return reject(new Error(`missing is needed data`)) }) ใช้ Promise.reject responsePromise = Promise.reject(new Error(`Unsupported method "${request.httpMethod}"`)); รุ่น ต่อไปนี้เป็นรุ่นในการอ้างอิง dev ของฉัน: "typescript": "^2.2.2" "@types/aws-lambda": "0.0.9", "@types/core-js": "^0.9.40", "@types/node": "^7.0.12", เนื้อหาของ …

4
AngularJS: จะใช้สัญญาได้ที่ไหน
ฉันเห็นตัวอย่างของบริการเข้าสู่ระบบ Facebook ที่ใช้สัญญาเพื่อเข้าถึง FB Graph API ตัวอย่าง # 1 : this.api = function(item) { var deferred = $q.defer(); if (item) { facebook.FB.api('/' + item, function (result) { $rootScope.$apply(function () { if (angular.isUndefined(result.error)) { deferred.resolve(result); } else { deferred.reject(result.error); } }); }); } return deferred.promise; } และบริการที่ใช้"$scope.$digest() // Manual scope evaluation"เมื่อได้รับการตอบสนอง …

13
ทำลายโซ่สัญญาและเรียกใช้ฟังก์ชันตามขั้นตอนในห่วงโซ่ที่ขาด (ปฏิเสธ)
อัปเดต: เพื่อช่วยผู้ชมโพสต์นี้ในอนาคตฉันได้สร้างตัวอย่างคำตอบของ plumaนี้ คำถาม: เป้าหมายของฉันค่อนข้างตรงไปตรงมา step(1) .then(function() { return step(2); }, function() { stepError(1); return $q.reject(); }) .then(function() { }, function() { stepError(2); }); function step(n) { var deferred = $q.defer(); //fail on step 1 (n === 1) ? deferred.reject() : deferred.resolve(); return deferred.promise; } function stepError(n) { console.log(n); } …

1
ฟิวเจอร์สกับสัญญา
ฉันสับสนกับความแตกต่างระหว่างอนาคตกับคำสัญญา เห็นได้ชัดว่าพวกเขามีวิธีการและสิ่งต่าง ๆ แต่กรณีการใช้งานจริงเป็นอย่างไร? ใช่ไหม?: เมื่อฉันจัดการงาน async ฉันใช้อนาคตเพื่อรับค่า "ในอนาคต" เมื่อฉันเป็นงาน async ฉันใช้สัญญาเป็นประเภทการส่งคืนเพื่อให้ผู้ใช้ได้รับอนาคตจากสัญญาของฉัน
138 c++  c++11  promise  future 

8
NodeJS UnhandledPromise การปฏิเสธคำเตือน
ดังนั้นฉันกำลังทดสอบส่วนประกอบที่ต้องอาศัยตัวปล่อยเหตุการณ์ เมื่อต้องการทำเช่นนั้นฉันจึงหาวิธีแก้ปัญหาโดยใช้สัญญากับมอคค่า + ชัย: it('should transition with the correct event', (done) => { const cFSM = new CharacterFSM({}, emitter, transitions); let timeout = null; let resolved = false; new Promise((resolve, reject) => { emitter.once('action', resolve); emitter.emit('done', {}); timeout = setTimeout(() => { if (!resolved) { reject('Timedout!'); } clearTimeout(timeout); }, 100); …

5
การคืนสัญญาจากการกระทำของ Vuex
ฉันเพิ่งเริ่มโยกย้ายสิ่งต่างๆจาก jQ ไปยังเฟรมเวิร์กที่มีโครงสร้างมากกว่าคือ VueJS และฉันก็ชอบมัน! ตามแนวคิดแล้ว Vuex เป็นการปรับเปลี่ยนกระบวนทัศน์เล็กน้อยสำหรับฉัน แต่ฉันมั่นใจว่าฉันรู้ว่าตอนนี้มันเป็นอย่างไรและเข้าใจทั้งหมด! แต่มีพื้นที่สีเทาเล็กน้อยส่วนใหญ่มาจากมุมมองของการนำไปใช้งาน อันนี้ฉันรู้สึกว่าดีจากการออกแบบ แต่ไม่รู้ว่ามันขัดแย้งกับวัฏจักร Vuex ของการไหลของข้อมูลแบบทิศทางเดียวหรือไม่ โดยพื้นฐานแล้วถือเป็นแนวทางปฏิบัติที่ดีในการคืนสัญญา (- เหมือน) วัตถุจากการกระทำหรือไม่? ฉันถือว่าสิ่งเหล่านี้เป็นเหมือน async wrappers ด้วยสถานะของความล้มเหลวและสิ่งที่คล้ายกันดังนั้นดูเหมือนว่าจะเหมาะสมที่จะคืนสัญญา ผู้กลายพันธุ์ในทางตรงกันข้ามจะเปลี่ยนสิ่งต่าง ๆ และเป็นโครงสร้างที่บริสุทธิ์ภายในร้านค้า / โมดูล

5
เหตุใดฟังก์ชันอะซิงโครนัสของฉันจึงส่งคืน Promise {<pending>} แทนที่จะเป็นค่า
รหัสของฉัน: let AuthUser = data =&gt; { return google.login(data.username, data.password).then(token =&gt; { return token } ) } และเมื่อฉันพยายามเรียกใช้สิ่งนี้: let userToken = AuthUser(data) console.log(userToken) ฉันได้รับ: Promise { &lt;pending&gt; } แต่ทำไม? เป้าหมายหลักของฉันคือการได้รับโทเค็นgoogle.login(data.username, data.password)ซึ่งส่งคืนสัญญาเป็นตัวแปร จากนั้นให้ดำเนินการบางอย่างล่วงหน้า

6
ทำไมฉันถึงโยนเข้าไปในตัวจัดการ Promise.catch ไม่ได้?
เหตุใดฉันจึงไม่สามารถโยนการErrorเรียกกลับที่จับได้และปล่อยให้กระบวนการจัดการกับข้อผิดพลาดราวกับว่ามันอยู่ในขอบเขตอื่น ๆ ถ้าฉันไม่ทำconsole.log(err)อะไรจะถูกพิมพ์ออกมาและฉันก็ไม่รู้ว่าเกิดอะไรขึ้น กระบวนการก็จบลง ... ตัวอย่าง: function do1() { return new Promise(function(resolve, reject) { throw new Error('do1'); setTimeout(resolve, 1000) }); } function do2() { return new Promise(function(resolve, reject) { setTimeout(function() { reject(new Error('do2')); }, 1000) }); } do1().then(do2).catch(function(err) { //console.log(err.stack); // This is the only way to see the stack …

9
คำสัญญาสามารถมีข้อโต้แย้งหลายข้อถึง onFulfilled ได้หรือไม่?
ฉันทำตามข้อมูลจำเพาะที่นี่และฉันไม่แน่ใจว่าอนุญาตให้เรียก onFulfilled ด้วยอาร์กิวเมนต์หลายรายการหรือไม่ ตัวอย่างเช่น: promise = new Promise(function(onFulfilled, onRejected){ onFulfilled('arg1', 'arg2'); }) ดังนั้นรหัสของฉัน: promise.then(function(arg1, arg2){ // .... }); จะได้รับทั้งสองarg1และarg2? ฉันไม่สนใจว่าจะมีการดำเนินการตามสัญญาใด ๆ อย่างไรฉันต้องการทำตามข้อกำหนด w3c สำหรับคำสัญญาอย่างใกล้ชิด

18
วิธีรวมไฟล์ js หลายไฟล์โดยใช้วิธี jQuery $ .getScript ()
ฉันกำลังพยายามรวมไฟล์ javascript ลงในไฟล์ js ของฉันแบบไดนามิก ฉันได้ค้นคว้าเกี่ยวกับเรื่องนี้และพบว่าวิธีการ jQuery $ .getScript () น่าจะเป็นวิธีที่ต้องการ // jQuery $.getScript('/path/to/imported/script.js', function() { // script is now loaded and executed. // put your dependent JS here. // what if the JS code is dependent on multiple JS files? }); แต่ฉันสงสัยว่าวิธีนี้สามารถโหลดหลายสคริปต์พร้อมกันได้หรือไม่? สาเหตุที่ฉันถามสิ่งนี้เป็นเพราะบางครั้งไฟล์จาวาสคริปต์ของฉันขึ้นอยู่กับไฟล์ js มากกว่าหนึ่งไฟล์ ขอบคุณล่วงหน้า.

5
คุณสามารถแก้ไขสัญญา angularjs ก่อนที่จะส่งคืนได้หรือไม่?
ฉันพยายามเขียนฟังก์ชันที่ส่งคืนคำสัญญา แต่มีหลายครั้งที่ข้อมูลที่ร้องขอจะพร้อมใช้งานทันที ฉันต้องการที่จะสรุปไว้ในสัญญาเพื่อให้ผู้บริโภคไม่จำเป็นต้องตัดสินใจ function getSomething(id) { if (Cache[id]) { var deferred = $q.defer(); deferred.resolve(Cache[id]); // &lt;-- Can I do this? return deferred.promise; } else { return $http.get('/someUrl', {id:id}); } } และใช้มันดังนี้: somethingService.getSomething(5).then(function(thing) { alert(thing); }); ปัญหาคือการโทรกลับไม่ดำเนินการสำหรับสัญญาที่แก้ไขไว้ล่วงหน้า นี่เป็นสิ่งที่ถูกต้องหรือไม่? มีวิธีที่ดีกว่านี้ในการจัดการกับสถานการณ์นี้หรือไม่?
125 angularjs  promise 

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