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

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

1
วิธีการปฏิเสธคำสัญญาจากภายในแล้วฟังก์ชั่น
นี่อาจเป็นคำถามโง่ ๆ แต่คำสัญญากลางคุณจะปฏิเสธคำสัญญาจากภายในหนึ่งในฟังก์ชั่นนี้ได้อย่างไร ตัวอย่างเช่น: someActionThatReturnsAPromise() .then(function(resource) { return modifyResource(resource) }) .then(function(modifiedResource) { if (!isValid(modifiedResource)) { var validationError = getValidationError(modifiedResource); // fail promise with validationError } }) .catch(function() { // oh noes }); ไม่มีการอ้างอิงถึงฟังก์ชันแก้ไข / ปฏิเสธดั้งเดิมหรือ PromiseResolver อีกต่อไป ฉันควรจะเพิ่มreturn Promise.reject(validationError);ไหม

5
วิธีตรวจสอบว่ามีการแก้ไขสัญญา Angular $ q หรือไม่
ฉันเข้าใจว่าโดยทั่วไปแล้วเราจะแนบรหัสความต่อเนื่องที่มีลักษณะการthen()โทรและลูกโซ่เมื่อใช้คำสัญญา อย่างไรก็ตามฉันต้องการเริ่มต้นการโทรแบบอะซิงโครนัสที่ผูกมัดตามสัญญาแล้วเริ่มต้น 3 วินาที$timeout()เพื่อให้ฉันสามารถดำเนินการ UI ได้เฉพาะในกรณีที่สัญญาเดิมยังไม่เสร็จสมบูรณ์ (ฉันคาดว่าสิ่งนี้จะเกิดขึ้นเฉพาะกับการเชื่อมต่อที่ช้าอุปกรณ์มือถือบน 3G ฯลฯ ) เมื่อได้รับสัญญาฉันสามารถตรวจสอบได้ว่าเสร็จสมบูรณ์หรือไม่โดยไม่ปิดกั้นหรือรอ?
84 angularjs  promise  q 

2
หน่วยความจำการล้างข้อมูลรั่วไหลบนคอมโพเนนต์ที่ไม่ได้ประกอบเข้าไปใน React Hooks
ฉันใหม่โดยใช้ React ดังนั้นนี่อาจเป็นเรื่องง่ายที่จะประสบความสำเร็จ แต่ฉันไม่สามารถหาคำตอบได้ด้วยตัวเองแม้ว่าฉันจะทำวิจัยแล้วก็ตาม ยกโทษให้ฉันถ้านี่มันโง่เกินไป บริบท ฉันใช้Inertia.jsกับอะแดปเตอร์ Laravel (แบ็กเอนด์) และ React (front-end) หากคุณไม่รู้จักความเฉื่อยมันเป็นเรื่องปกติ: Inertia.js ให้คุณสร้างแอป React, Vue และ Svelte แบบหน้าเดียวที่ทันสมัยได้อย่างรวดเร็วโดยใช้การกำหนดเส้นทางและตัวควบคุมฝั่งเซิร์ฟเวอร์แบบคลาสสิก ปัญหา ฉันกำลังทำหน้าเข้าสู่ระบบแบบง่ายที่มีแบบฟอร์มที่เมื่อส่งจะทำการร้องขอ POST เพื่อโหลดหน้าถัดไป ดูเหมือนว่าจะทำงานได้ดี แต่ในหน้าอื่น ๆ คอนโซลจะแสดงคำเตือนต่อไปนี้: คำเตือน: ไม่สามารถทำการอัพเดทสถานะทำปฏิกิริยากับส่วนประกอบที่ไม่ได้ประกอบเข้าไป นี่คือไม่ใช้งาน แต่ระบุว่ามีหน่วยความจำรั่วในแอปพลิเคชันของคุณ ในการแก้ไขให้ยกเลิกการสมัครสมาชิกและงานอะซิงโครนัสทั้งหมดในฟังก์ชัน useEffect cleanup ในการเข้าสู่ระบบ (สร้างโดย Inertia) รหัสที่เกี่ยวข้อง (ฉันได้ง่ายขึ้นเพื่อหลีกเลี่ยงบรรทัดที่ไม่เกี่ยวข้อง): import React, { useEffect, useState } from 'react' import Layout …

4
เหตุใดการตั้งค่าคุณสมบัติ CSS โดยใช้ Promise แล้วไม่เกิดขึ้นจริงในบล็อกนั้น
โปรดลองและเรียกใช้ตัวอย่างต่อไปนี้จากนั้นคลิกที่กล่อง const box = document.querySelector('.box') box.addEventListener('click', e => { if (!box.style.transform) { box.style.transform = 'translateX(100px)' new Promise(resolve => { setTimeout(() => { box.style.transition = 'none' box.style.transform = '' resolve('Transition complete') }, 2000) }).then(() => { box.style.transition = '' }) } }) .box { width: 100px; height: 100px; border-radius: 5px; background-color: …

2
จะจัดคิว microtask ได้อย่างไรถ้าเบราว์เซอร์ไม่สนับสนุน Promises ดั้งเดิม
ควรเขียนโค้ดที่ไม่ต้องพึ่งพาช่วงเวลาของการโทรกลับทันที (เช่น microtasks vs macrotasks) แต่ลองทิ้งไว้สักครู่ setTimeoutรอคิว macrotask ซึ่งอย่างน้อยก็รอให้เริ่มจนกว่า microtasks ทั้งหมด (และ microtasks ที่วางไข่) จะเสร็จสิ้น นี่คือตัวอย่าง: console.log('Macrotask queued'); setTimeout(function() { console.log('Macrotask running'); }); Promise.resolve() .then(function() { console.log('Microtask running'); }); console.log('Microtask queued'); console.log('Last line of script'); เรียกใช้ข้อมูลโค้ดซ่อนผลลัพธ์ขยายตัวอย่างข้อมูล พฤติกรรมของ a .thenon the Promise ที่ได้รับการแก้ไขนั้นแตกต่างจากพฤติกรรมของการsetTimeoutโทรกลับทันที- Promise .thenจะทำงานก่อนแม้ว่าจะsetTimeoutถูกจัดคิวก่อน แต่เบราว์เซอร์ที่ทันสมัยเท่านั้นที่สนับสนุนสัญญา วิธีสามารถพิเศษการทำงานของ microtask คนหนึ่ง polyfilled ถูกต้องหากPromiseไม่อยู่? …

3
การค้นหาแหล่งที่มาของการปฏิเสธสัญญาที่ไม่สามารถจัดการได้: TypeError: ตรวจพบวงจรการผูกมัดสำหรับสัญญา
ฉันพยายามค้นหาแหล่งที่มาของการปฏิเสธที่ไม่มีการจัดการจาก Promise ใน Node.js ฉันได้ลองอัพเกรดเป็น Node เวอร์ชัน 12 โดยใช้--async-stack-tracesตัวเลือกและฟังโดยใช้: process.on("unhandledRejection",( reason, promise ) => { console.log(reason); console.log(promise); }); แต่ฉันก็ยังไม่เห็นร่องรอยสแต็คที่เป็นประโยชน์ใด ๆ ที่จะช่วยฉันหาผู้กระทำผิด! UnhandledPromiseRejectionWarning: TypeError: Chaining cycle detected for promise #<Promise> at process._tickCallback (internal/process/next_tick.js:68:7) (node:89675) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a …

1
ด้วยสัญญาทำไมเบราว์เซอร์กลับปฏิเสธสองครั้ง แต่ไม่ได้รับการแก้ไขสองครั้ง?
ฉันมีปัญหาในการทำความเข้าใจ promisesjavaScript ฉันเขียนรหัสต่อไปนี้: var p = new Promise(function(resolve,reject){ reject(Error("hello world")); }); setTimeout(()=>p.catch(e=>console.log(e)),5000); ฉันเห็นสิ่งนี้ในคอนโซลนักพัฒนาซอฟต์แวร์ Chrome ทันที: แต่หลังจากฉันรอ 5 วินาทีข้อความจะเปลี่ยนเป็นสีดำเหมือนภาพนี้โดยอัตโนมัติ: ฉันไม่เคยเห็นพฤติกรรมนี้มาก่อนระหว่างรหัส javaScript ของฉันและคอนโซลนักพัฒนาซอฟต์แวร์ซึ่งรหัส javaScript ของฉันสามารถ "แก้ไขเนื้อหาที่มีอยู่" ในคอนโซลนักพัฒนาซอฟต์แวร์ ดังนั้นฉันตัดสินใจที่จะดูว่าสถานการณ์เดียวกันเกิดขึ้นกับresolveการเขียนรหัสนี้: var p = new Promise(function(resolve,reject){ resolve("hello world"); }); setTimeout(()=>p.then(e=>console.log(e)),5000); แต่ในสถานการณ์นี้คอนโซลนักพัฒนาซอฟต์แวร์ของฉันจะไม่แสดงผลใด ๆ จนกว่าจะถึง 5 วินาทีหลังจากนั้นซึ่งจะพิมพ์hello worldออกมา ทำไมresolveและrejectได้รับการปฏิบัติที่แตกต่างกันในแง่ของเมื่อพวกเขาถูกเรียก? EXTRA ฉันยังเขียนรหัสนี้: var p = new Promise(function(resolve,reject){ reject(Error("hello …

1
ฉันจะหมดเวลาสัญญาใน Raku ได้อย่างไร
ฉันรู้ว่าฉันสามารถกำหนดเวลาPromiseที่จะเก็บไว้ในระยะเวลาที่กำหนดด้วย my $promise = Promise.in($seconds); แต่ฉันจะกำหนดให้มันเสียได้อย่างไร โดยเฉพาะฉันคิดถึงสัญญาที่จะ "หมดเวลา" เพื่อให้มีเวลามากพอที่จะเก็บไว้ไม่เช่นนั้นจะล้มเหลว ฉันสามารถทำสิ่งนี้กับอีกPromiseเช่น: my $promise = Promise.new; ... Promise.in($seconds).then: { $promise.break }; แต่นี่ให้ความรู้สึกเล็กน้อย ... สิ้นเปลือง มีวิธีที่ดีกว่าในการทำเช่นนี้?
9 promise  raku 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.