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

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

5
อะไรคือความแตกต่างระหว่างสัญญา JavaScript และ async รอ?
ฉันใช้คุณสมบัติECMAScript 6และ ECMAScript 7 อยู่แล้ว (ขอบคุณ Babel) ในแอปพลิเคชันของฉัน - ทั้งมือถือและเว็บ ขั้นตอนแรกที่เห็นได้ชัดคือ ECMAScript 6 ระดับ ฉันได้เรียนรู้รูปแบบการไม่ซิงค์คำสัญญา (ซึ่งมีแนวโน้มจริงๆ) เครื่องกำเนิดไฟฟ้า (ไม่แน่ใจว่าทำไมจึงต้องใช้สัญลักษณ์ *) ฯลฯ จากสิ่งเหล่านี้สัญญาจึงเหมาะกับจุดประสงค์ของฉัน และฉันได้ใช้มันในแอปพลิเคชันของฉันค่อนข้างมาก นี่คือตัวอย่าง / รหัสเทียมของวิธีที่ฉันใช้คำสัญญาพื้นฐาน - var myPromise = new Promise( function (resolve,reject) { var x = MyDataStore(myObj); resolve(x); }); myPromise.then( function (x) { init(x); }); เมื่อเวลาผ่านไปฉันได้พบกับคุณลักษณะของ ECMAScript 7 และหนึ่งในนั้นคือASYNCและAWAITคำหลัก …

2
เหตุใดสัญญา javascript ES6 จึงดำเนินการต่อไปหลังจากการแก้ไข
ตามที่ฉันเข้าใจคำสัญญาคือสิ่งที่สามารถแก้ไข () หรือปฏิเสธ () ได้ แต่ฉันรู้สึกแปลกใจที่พบว่ารหัสในสัญญายังคงดำเนินการต่อไปหลังจากมีการเรียกการแก้ไขหรือปฏิเสธ ฉันถือว่าการแก้ไขหรือปฏิเสธเป็นเวอร์ชันที่เป็นมิตรกับสิ่งแวดล้อมของ exit หรือ return ซึ่งจะหยุดการทำงานของฟังก์ชันทันทีทั้งหมด ใครช่วยอธิบายความคิดเบื้องหลังว่าทำไมบางครั้งตัวอย่างต่อไปนี้จึงแสดง console.log หลังจากการโทรแก้ไข: var call = function() { return new Promise(function(resolve, reject) { resolve(); console.log("Doing more stuff, should not be visible after a resolve!"); }); }; call().then(function() { console.log("resolved"); }); jsbin

5
สัญญาส่งพารามิเตอร์เพิ่มเติมไปที่โซ่แล้ว
คำสัญญาตัวอย่างเช่น: var P = new Promise(function (resolve, reject) { var a = 5; if (a) { setTimeout(function(){ resolve(a); }, 3000); } else { reject(a); } }); หลังจากที่เราเรียก.then()วิธีการตามสัญญา: P.then(doWork('text')); จากนั้นdoWorkฟังก์ชันจะมีลักษณะดังนี้: function doWork(data) { return function(text) { // sample function to console log consoleToLog(data); consoleToLog(b); } } ฉันจะหลีกเลี่ยงการส่งคืนฟังก์ชันภายในใน doWork เพื่อเข้าถึงข้อมูลจากพารามิเตอร์สัญญาและข้อความได้อย่างไร มีเทคนิคในการหลีกเลี่ยงฟังก์ชันด้านในหรือไม่?

2
TypeError: ไม่สามารถอ่านคุณสมบัติ 'แล้ว' ของที่ไม่ได้กำหนด
loginService.islogged() ฟังก์ชันด้านบนส่งคืนสตริงเช่น "ล้มเหลว" อย่างไรก็ตามเมื่อฉันพยายามเรียกใช้ฟังก์ชันนั้นมันจะส่งคืนข้อผิดพลาดของ TypeError: Cannot read property 'then' of undefined และเคอร์เซอร์มีที่บ่งชี้ขวาหลังจากและก่อนที่connected.then ด้านล่างนี้คือฟังก์ชั่นเต็มรูปแบบ: var connected=loginService.islogged(); alert(connected); connected.then(function(msg){ alert("connected value is "+connected); alert("msg.data value is "+msg.data); if(!msg.data.account_session || loginService.islogged()=="failed") $location.path('/login'); }); อัปเดต นี่คือislogged()ฟังก์ชั่น islogged:function(){ var cUid=sessionService.get('uid'); alert("in loginServce, cuid is "+cUid); var $checkSessionServer=$http.post('data/check_session.php?cUid='+cUid); $checkSessionServer.then(function(){ alert("session check returned!"); console.log("checkSessionServer is "+$checkSessionServer); return …

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); }

3
Promise.all () แล้ว () แก้ไข?
การใช้ Node 4.x. เมื่อคุณมีPromise.all(promises).then()สิ่งที่เป็นวิธีการที่เหมาะสมในการแก้ไขข้อมูลและผ่านมันไปยัง.then()? ฉันต้องการทำสิ่งนี้: Promise.all(promises).then(function(data){ // Do something with the data here }).then(function(data){ // Do more stuff here }); แต่ฉันไม่แน่ใจว่าจะรับข้อมูลไปที่ 2 .then()ได้อย่างไร ฉันไม่สามารถใช้ในครั้งแรกresolve(...) .then()ฉันคิดว่าฉันสามารถทำได้: return Promise.all(promises).then(function(data){ // Do something with the data here return data; }).then(function(data){ // Do more stuff here }); แต่ดูเหมือนจะไม่ใช่วิธีที่เหมาะสมที่จะทำ ... อะไรคือแนวทางที่ถูกต้องสำหรับสิ่งนี้?

3
วิธีการทำสัญญาจาก setTimeout
นี่ไม่ใช่ปัญหาในโลกแห่งความเป็นจริงฉันแค่พยายามทำความเข้าใจว่าสัญญาถูกสร้างขึ้นมาอย่างไร ฉันต้องเข้าใจวิธีสร้างคำมั่นสัญญาสำหรับฟังก์ชันที่ไม่ส่งคืนค่าใด ๆ เช่น setTimeout สมมติว่าฉันมี: function async(callback){ setTimeout(function(){ callback(); }, 5000); } async(function(){ console.log('async called back'); }); ฉันจะสร้างสัญญาที่asyncสามารถกลับมาหลังจากsetTimeoutพร้อมที่จะทำcallback()อย่างไร? ฉันคิดว่าการห่อมันจะพาฉันไปที่ไหนสักแห่ง: function setTimeoutReturnPromise(){ function promise(){} promise.prototype.then = function() { console.log('timed out'); }; setTimeout(function(){ return ??? },2000); return promise; } แต่ฉันไม่สามารถคิดนอกเหนือจากนี้

9
สัญญา - เป็นไปได้ไหมที่จะบังคับให้ยกเลิกคำสัญญา
ฉันใช้ ES6 Promises เพื่อจัดการการดึงข้อมูลเครือข่ายทั้งหมดของฉันและมีบางสถานการณ์ที่ฉันจำเป็นต้องบังคับให้ยกเลิก โดยทั่วไปสถานการณ์จะเป็นเช่นนั้นฉันมีการค้นหาพิมพ์ล่วงหน้าบน UI ซึ่งคำขอถูกมอบหมายให้กับแบ็กเอนด์ต้องดำเนินการค้นหาตามอินพุตบางส่วน แม้ว่าคำขอเครือข่ายนี้ (# 1) อาจใช้เวลาสักหน่อย แต่ผู้ใช้ยังคงพิมพ์ต่อไปซึ่งจะเรียกใช้การเรียกแบ็กเอนด์อื่นในที่สุด (# 2) ที่นี่ # 2 โดยธรรมชาติจะมีความสำคัญเหนือ # 1 ดังนั้นฉันจึงต้องการยกเลิกคำขอตัดสัญญา # 1 ฉันมีแคชของสัญญาทั้งหมดในชั้นข้อมูลอยู่แล้วดังนั้นฉันจึงสามารถดึงข้อมูลได้ในทางทฤษฎีขณะที่ฉันพยายามส่งสัญญาสำหรับ # 2 แต่ฉันจะยกเลิก Promise # 1 ได้อย่างไรเมื่อฉันดึงมันจากแคช มีใครแนะนำแนวทางได้ไหม

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); …

6
การลบข้อผิดพลาดในการจับสัญญา
ฉันพบรหัสต่อไปนี้ในบทช่วยสอน: promise.then(function(result){ //some code }).catch(function(error) { throw(error); }); ฉันสับสนเล็กน้อย: การโทรจับได้สำเร็จหรือไม่? สำหรับฉันแล้วดูเหมือนว่ามันจะไม่มีผลใด ๆ เนื่องจากมันเพียงแค่แสดงข้อผิดพลาดเดียวกันกับที่ถูกจับได้ ฉันยึดตามวิธีการทำงานของ try / catch เป็นประจำ

1
ไม่เคยแก้ไขสัญญาทำให้หน่วยความจำรั่ว?
ฉันมีPromise. ฉันสร้างมันขึ้นเพื่อยกเลิกคำขอ AJAX หากจำเป็น แต่เนื่องจากฉันไม่จำเป็นต้องยกเลิก AJAX นั้นฉันจึงไม่เคยแก้ไขเลยและ AJAX ก็ทำสำเร็จ ข้อมูลโค้ดแบบง่าย: var defer = $q.defer(); $http({url: 'example.com/some/api', timeout: defer.promise}).success(function(data) { // do something }); // Never defer.resolve() because I don't need to cancel that ajax. What happens to this promise after request? ไม่เคยแก้สัญญาเช่นนั้นทำให้หน่วยความจำรั่วไหล? คุณมีคำแนะนำเกี่ยวกับการจัดการPromiseวงจรชีวิตหรือไม่?

5
วิธีคืนสัญญามากมายและรอให้หมดก่อนทำอย่างอื่น
ฉันมีลูปที่เรียกเมธอดที่ทำสิ่งต่างๆแบบอะซิงโครนัส ลูปนี้สามารถเรียกใช้เมธอดได้หลายครั้ง หลังจากลูปนี้ฉันมีลูปอื่นที่ต้องดำเนินการก็ต่อเมื่อทำสิ่งที่ไม่ตรงกันทั้งหมด สิ่งนี้แสดงให้เห็นถึงสิ่งที่ฉันต้องการ: for (i = 0; i < 5; i++) { doSomeAsyncStuff(); } for (i = 0; i < 5; i++) { doSomeStuffOnlyWhenTheAsyncStuffIsFinish(); } ฉันไม่ค่อยคุ้นเคยกับคำสัญญามีใครช่วยฉันทำสิ่งนี้ให้สำเร็จได้บ้าง นี่คือdoSomeAsyncStuff()พฤติกรรมของฉัน: function doSomeAsyncStuff() { var editor = generateCKEditor(); editor.on('instanceReady', function(evt) { doSomeStuff(); // There should be the resolve() of the promises I think. …

9
คุณจะคืนค่าหลายค่าจากสัญญาได้อย่างไร?
เมื่อเร็ว ๆ นี้ฉันต้องเจอกับสถานการณ์บางอย่างสองสามครั้งซึ่งฉันไม่รู้วิธีแก้ปัญหาอย่างถูกต้อง สมมติรหัสต่อไปนี้: somethingAsync() .then( afterSomething ) .then( afterSomethingElse ) function afterSomething( amazingData ) { return processAsync( amazingData ); } function afterSomethingElse( processedData ) { } ตอนนี้สถานการณ์อาจเกิดขึ้นที่ฉันต้องการที่จะมีการเข้าถึงในamazingDataafterSomethingElse วิธีแก้ปัญหาที่ชัดเจนวิธีหนึ่งคือการส่งคืนอาร์เรย์หรือแฮชจากafterSomethingเนื่องจากคุณสามารถส่งคืนค่าจากฟังก์ชันได้เพียงค่าเดียว แต่ฉันสงสัยว่ามีวิธีafterSomethingElseยอมรับ 2 พารามิเตอร์และเรียกใช้ในลักษณะเดียวกันหรือไม่เพราะดูเหมือนจะง่ายกว่ามากในการจัดทำเอกสารและทำความเข้าใจ ฉันแค่สงสัยเกี่ยวกับความเป็นไปได้นี้เนื่องจากมีQ.spreadสิ่งที่คล้ายกับที่ฉันต้องการ
87 javascript  promise  q 

3
จะจัดการกับ if-else ในสัญญาได้อย่างไร?
ในบางกรณีเมื่อฉันได้รับค่าส่งคืนจากวัตถุสัญญาฉันต้องเริ่มต้นพรีเซสสองรายการที่แตกต่างกันthen()ขึ้นอยู่กับเงื่อนไขของค่าเช่น: promise().then(function(value){ if(//true) { // do something } else { // do something } }) ฉันคิดว่าอาจจะเขียนได้ว่า: promise().then(function(value){ if(//true) { // call a new function which will return a new promise object ifTruePromise().then(); } else { ifFalsePromise().then(); } }) แต่ด้วยสิ่งนี้ฉันมีสองคำถาม: ฉันไม่แน่ใจว่าเป็นความคิดที่ดีหรือไม่ที่จะเริ่มต้นสัญญาใหม่จากนั้นดำเนินการตามคำสัญญา จะเกิดอะไรขึ้นถ้าฉันต้องการให้สองกระบวนการเรียกใช้ฟังก์ชันหนึ่งในครั้งสุดท้าย? หมายความว่ามี "ขั้ว" เดียวกัน ฉันพยายามที่จะคืนสัญญาใหม่เพื่อรักษาห่วงโซ่เดิมเช่น: promise().then(function(value){ if(//true) { // call …


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