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

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

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 หากมีการปฏิเสธ ณ จุดนี้ให้ทิ้งระเบิดและส่งคืนข้อผิดพลาด หากไม่มีข้อผิดพลาดในการแปลงเอกสารกลับไปเป็นแบบจำลอง ตรวจสอบรหัสผ่านด้วยเอกสารฐานข้อมูล หากรหัสผ่านไม่ตรงกันให้ทิ้งระเบิดและส่งคืนข้อผิดพลาดอื่น หากไม่มีข้อผิดพลาดให้เปลี่ยนรหัสผ่าน …

4
วิธีการส่งพารามิเตอร์ไปยังฟังก์ชันสัญญา
นี่อาจดูเป็นคำถามที่ไร้สาระ แต่ฉันเป็นมือใหม่ในหัวข้อนี้ ฉันกำลังทำตามคำสัญญาบนโหนด js และฉันต้องการส่งผ่านพารามิเตอร์ไปยังฟังก์ชันคำมั่นสัญญา อย่างไรก็ตามฉันไม่สามารถเข้าใจได้ someModule.someFunction.then(username, password,function(uid) { /*stuff */ } และฟังก์ชันก็เป็นเช่นนั้น var someFunction = new Promise(username, password, function(resolve, reject) { /*stuff using username, password*/ if ( /* everything turned out fine */ ) { resolve("Stuff worked!"); } else { reject(Error("It broke")); } });

5
จะสร้าง Observable จากข้อมูลคงที่คล้ายกับ http one ใน Angular ได้อย่างไร
ฉันมีบริการที่มีวิธีการนี้: export class TestModelService { public testModel: TestModel; constructor( @Inject(Http) public http: Http) { } public fetchModel(uuid: string = undefined): Observable<string> { if(!uuid) { //return Observable of JSON.stringify(new TestModel()); } else { return this.http.get("http://localhost:8080/myapp/api/model/" + uuid) .map(res => res.text()); } } } ในตัวสร้างของคอมโพเนนต์ฉันสมัครสมาชิกดังนี้: export class MyComponent { testModel: TestModel; testModelService: …

4
โหนด JS Promise.all และ forEach
ฉันมีโครงสร้างเหมือนอาร์เรย์ที่เปิดเผยเมธอด async เมธอด async เรียกใช้โครงสร้างอาร์เรย์ที่ส่งคืนซึ่งจะแสดงวิธีการ async มากขึ้น ฉันกำลังสร้างออบเจ็กต์ JSON อื่นเพื่อเก็บค่าที่ได้รับจากโครงสร้างนี้ดังนั้นฉันจึงต้องระมัดระวังในการติดตามการอ้างอิงในการเรียกกลับ ฉันได้เขียนโค้ดวิธีแก้ปัญหาแบบเดรัจฉานแล้ว แต่ฉันต้องการเรียนรู้วิธีแก้ปัญหาที่เป็นสำนวนหรือสะอาดกว่านี้ รูปแบบควรทำซ้ำได้สำหรับ n ระดับของการทำรัง ฉันจำเป็นต้องใช้คำมั่นสัญญาทั้งหมดหรือเทคนิคบางอย่างที่คล้ายกันเพื่อพิจารณาว่าเมื่อใดควรแก้ไขรูทีนการปิดล้อม ไม่ใช่ทุกองค์ประกอบที่จำเป็นต้องเกี่ยวข้องกับการโทรแบบ async ดังนั้นในสัญญาที่ซ้อนกันทั้งหมดฉันไม่สามารถกำหนดองค์ประกอบอาร์เรย์ JSON ของฉันตามดัชนีได้ อย่างไรก็ตามฉันจำเป็นต้องใช้บางอย่างเช่นคำสัญญาทั้งหมดในที่ซ้อนกัน forEach เพื่อให้แน่ใจว่ามีการกำหนดคุณสมบัติทั้งหมดก่อนที่จะแก้ไขรูทีนการปิดล้อม ฉันใช้ bluebird สัญญา lib แต่นี่ไม่ใช่ข้อกำหนด นี่คือรหัสบางส่วน - var jsonItems = []; items.forEach(function(item){ var jsonItem = {}; jsonItem.name = item.name; item.getThings().then(function(things){ // or Promise.all(allItemGetThingCalls, function(things){ things.forEach(function(thing, index){ …

4
กลับจากคำสัญญาแล้ว ()
ฉันมีรหัสจาวาสคริปต์เช่นนี้: function justTesting() { promise.then(function(output) { return output + 1; }); } var test = justTesting(); ฉันมีค่าที่ไม่ได้กำหนดไว้เสมอสำหรับการทดสอบ var ฉันคิดว่าคงเป็นเพราะคำสัญญาที่ยังไม่ได้รับการแก้ไข .. มีวิธีคืนค่าจากคำสัญญาหรือไม่?

4
ทำไม. json () ถึงคืนคำสัญญา?
fetch()เมื่อเร็ว ๆ นี้ฉันยุ่งกับapi และสังเกตเห็นบางอย่างที่แปลกไปหน่อย let url = "http://jsonplaceholder.typicode.com/posts/6"; let iterator = fetch(url); iterator .then(response => { return { data: response.json(), status: response.status } }) .then(post => document.write(post.data)); ; post.dataส่งคืนPromiseวัตถุ http://jsbin.com/wofulo/2/edit?js,output อย่างไรก็ตามหากเขียนเป็น: let url = "http://jsonplaceholder.typicode.com/posts/6"; let iterator = fetch(url); iterator .then(response => response.json()) .then(post => document.write(post.title)); ; postนี่คือมาตรฐานObjectที่คุณสามารถเข้าถึงแอตทริบิวต์หัวเรื่อง http://jsbin.com/wofulo/edit?js,output ดังนั้นคำถามของฉันคือทำไมresponse.jsonส่งคืนคำสัญญาในตัวอักษรของวัตถุ …

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 …

5
ใช้ setTimeout บนสายโซ่สัญญา
ที่นี่ฉันพยายามห่อหัวของฉันรอบ ๆ คำสัญญาที่นี่ในการร้องขอครั้งแรกฉันดึงชุดของลิงค์และในการร้องขอครั้งต่อไปฉันดึงเนื้อหาของลิงค์แรก แต่ฉันต้องการชะลอก่อนที่จะส่งคืนวัตถุสัญญาถัดไปดังนั้นฉันจึงใช้ setTimeout แต่มันทำให้ฉันมีข้อผิดพลาด JSON ต่อไปนี้ ( without setTimeout() it works just fine) SyntaxError: JSON.parse: อักขระที่ไม่คาดคิดที่บรรทัด 1 คอลัมน์ 1 ของข้อมูล JSON ฉันอยากรู้ว่าทำไมมันถึงล้มเหลว? let globalObj={}; function getLinks(url){ return new Promise(function(resolve,reject){ let http = new XMLHttpRequest(); http.onreadystatechange = function(){ if(http.readyState == 4){ if(http.status == 200){ resolve(http.response); }else{ reject(new Error()); } …
115 javascript  json  promise 

4
จะรอให้ JavaScript Promise แก้ไขก่อนที่จะกลับมาทำงานได้อย่างไร
ฉันกำลังทำการทดสอบหน่วย กรอบการทดสอบจะโหลดเพจลงใน iFrame จากนั้นเรียกใช้การยืนยันกับเพจนั้น ก่อนการทดสอบแต่ละครั้งจะเริ่มขึ้นฉันจะสร้างสิ่งPromiseที่กำหนดให้onloadเหตุการณ์ของ iFrame เรียกresolve()ตั้งค่า iFrame srcและส่งคืนคำสัญญา ดังนั้นฉันก็สามารถโทรloadUrl(url).then(myFunc)และมันจะรอให้การโหลดหน้าก่อนที่จะดำเนินสิ่งที่myFuncเป็น ฉันใช้รูปแบบประเภทนี้ทั่วทุกที่ในการทดสอบของฉัน (ไม่ใช่แค่การโหลด URL) โดยหลักแล้วเพื่อให้การเปลี่ยนแปลง DOM เกิดขึ้น (เช่นเลียนแบบการคลิกปุ่มและรอให้ divs ซ่อนและแสดง) ข้อเสียของการออกแบบนี้คือฉันมักจะเขียนฟังก์ชันที่ไม่ระบุตัวตนโดยมีโค้ดสองสามบรรทัดอยู่ในนั้น นอกจากนี้ในขณะที่ฉันมีวิธีแก้ไข (QUnit's assert.async()) ฟังก์ชันทดสอบที่กำหนดคำสัญญาจะเสร็จสมบูรณ์ก่อนที่สัญญาจะทำงาน ฉันสงสัยว่ามีวิธีใดที่จะได้รับค่าจากPromiseหรือรอ (บล็อก / นอนหลับ) จนกว่าจะได้รับการแก้ไขที่คล้ายกับของ IAsyncResult.WaitHandle.WaitOne().NET ฉันรู้ว่า JavaScript เป็นเธรดเดียว แต่ฉันหวังว่านั่นไม่ได้หมายความว่าฟังก์ชันจะไม่สามารถให้ผลลัพธ์ได้ โดยพื้นฐานแล้วมีวิธีที่จะทำให้สิ่งต่อไปนี้คายผลลัพธ์ตามลำดับที่ถูกต้องหรือไม่? function kickOff() { return new Promise(function(resolve, reject) { $("#output").append("start"); setTimeout(function() { resolve(); }, 1000); }).then(function() …

6
ใช้ความสำเร็จ / ข้อผิดพลาด / สุดท้าย / จับด้วยสัญญาใน AngularJS
ฉันกำลังใช้ $httpใน AngularJs และฉันไม่แน่ใจเกี่ยวกับวิธีใช้สัญญาที่ส่งคืนและจัดการข้อผิดพลาด ฉันมีรหัสนี้: $http .get(url) .success(function(data) { // Handle data }) .error(function(data, status) { // Handle HTTP error }) .finally(function() { // Execute logic independent of success/error }) .catch(function(error) { // Catch and handle exceptions from success/error/finally functions }); วิธีนี้เป็นวิธีที่ดีหรือมีวิธีที่ง่ายกว่านี้ไหม

16
ยกเลิกโซ่สัญญาวานิลลา ECMAScript 6
มีวิธีการล้างอินสแตนซ์.thenJavaScript Promiseหรือไม่? ผมเคยเขียนกรอบการทดสอบ JavaScript บนด้านบนของQUnit เฟรมเวิร์กจะทำการทดสอบพร้อมกันโดยรันแต่ละอันในไฟล์Promise. (ขออภัยสำหรับความยาวของบล็อกโค้ดนี้ฉันแสดงความคิดเห็นว่าดีที่สุดเท่าที่จะทำได้ดังนั้นจึงรู้สึกน่าเบื่อน้อยลง) /* Promise extension -- used for easily making an async step with a timeout without the Promise knowing anything about the function it's waiting on */ $$.extend(Promise, { asyncTimeout: function (timeToLive, errorMessage) { var error = new Error(errorMessage || "Operation timed out."); var …

7
$ .when.apply ($, someArray) ทำอะไร?
ฉันอ่านเกี่ยวกับ Deferreds และสัญญา$.when.apply($, someArray)และให้มาข้าม ฉันไม่ชัดเจนเล็กน้อยว่าสิ่งนี้ทำอะไรได้บ้างโดยกำลังมองหาคำอธิบายว่าหนึ่งบรรทัดทำงานได้ตรงกันทั้งหมด (ไม่ใช่ข้อมูลโค้ดทั้งหมด) นี่คือบริบทบางส่วน: var data = [1,2,3,4]; // the ids coming back from serviceA var processItemsDeferred = []; for(var i = 0; i < data.length; i++){ processItemsDeferred.push(processItem(data[i])); } $.when.apply($, processItemsDeferred).then(everythingDone); function processItem(data) { var dfd = $.Deferred(); console.log('called processItem'); //in the real world, this would probably …

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

5
รอให้ทุกคำสัญญาคลี่คลาย
ดังนั้นฉันจึงมีสถานการณ์ที่ฉันมีโซ่สัญญาหลายอันที่ไม่ทราบความยาว ฉันต้องการให้ดำเนินการบางอย่างเมื่อ CHAINS ทั้งหมดได้รับการประมวลผลแล้ว เป็นไปได้หรือไม่? นี่คือตัวอย่าง: app.controller('MainCtrl', function($scope, $q, $timeout) { var one = $q.defer(); var two = $q.defer(); var three = $q.defer(); var all = $q.all([one.promise, two.promise, three.promise]); all.then(allSuccess); function success(data) { console.log(data); return data + "Chained"; } function allSuccess(){ console.log("ALL PROMISES RESOLVED") } one.promise.then(success).then(success); two.promise.then(success); three.promise.then(success).then(success).then(success); $timeout(function () …

3
Angularjs $ q ทั้งหมด
ฉันใช้ $ q.all ใน angularjs แล้ว แต่ฉันไม่สามารถทำให้โค้ดทำงานได้ นี่คือรหัสของฉัน: UploadService.uploadQuestion = function(questions){ var promises = []; for(var i = 0 ; i < questions.length ; i++){ var deffered = $q.defer(); var question = questions[i]; $http({ url : 'upload/question', method: 'POST', data : question }). success(function(data){ deffered.resolve(data); }). error(function(error){ deffered.reject(); }); promises.push(deffered.promise); …
106 angularjs  promise  q 

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