কোনও ফাংশনের পরিবর্তনশীল ফিরিয়ে দেওয়ার আগে আমি কীভাবে প্রতিশ্রুতি শেষ করার জন্য অপেক্ষা করব?


149

আমি এখনও প্রতিশ্রুতি নিয়ে লড়াই করছি, তবে এখানকার সম্প্রদায়ের জন্য কিছু অগ্রগতি করছি।

আমার একটি সাধারণ জেএস ফাংশন রয়েছে যা পার্স ডাটাবেসের অনুসন্ধান করে। এটি ফলাফলের অ্যারেটি ফিরিয়ে আনার কথা, তবে স্পষ্টতই ক্যোয়ারের অ্যাসিক্রোনাস প্রকৃতির কারণে (তাই প্রতিশ্রুতি) ফাংশনটি ফলাফলের আগে ফিরে আসে, আমাকে একটি অপরিজ্ঞাত অ্যারে দিয়ে রেখে দেয়।

প্রতিশ্রুতির ফলাফলের জন্য এই ফাংশনটি অপেক্ষা করতে আমার কী করা দরকার?

আমার কোডটি এখানে:

function resultsByName(name)
{   
    var Card = Parse.Object.extend("Card");
    var query = new Parse.Query(Card);
    query.equalTo("name", name.toString());

    var resultsArray = [];

    var promise = query.find({
               success: function(results) {
               // results is an array of Parse.Object.
                             console.log(results);
                             //resultsArray = results;
                             return results;
               },

               error: function(error) {
               // error is an instance of Parse.Error.
                             console.log("Error");
               }
    });                           

}

3
আপনি async / অপেক্ষার ব্যবহার বিবেচনা করতে পারেন। নোড এখন অ্যাসিঙ্ক সমর্থন করে / বাক্স থেকে
অপেক্ষার জন্য

উত্তর:


66

পরিবর্তনের পরিবর্তে resultsArrayআপনি কোনও ফলাফল অ্যারে এবং তারপরে thenকল সাইটে এই প্রতিশ্রুতি ফিরিয়ে দেন - ফাংশনটি অ্যাসিঙ্ক্রোনাস I / O সম্পাদন করছে তা জেনে কলারের অতিরিক্ত যুক্ত সুবিধা রয়েছে। জাভাস্ক্রিপ্টে কোডিং সমঝোতা তার উপর ভিত্তি করে - আপনি একটি বিস্তৃত ধারণা পেতে এই প্রশ্নটি পড়তে চাইতে পারেন :

function resultsByName(name)
{   
    var Card = Parse.Object.extend("Card");
    var query = new Parse.Query(Card);
    query.equalTo("name", name.toString());

    var resultsArray = [];

    return query.find({});                           

}

// later
resultsByName("Some Name").then(function(results){
    // access results here by chaining to the returned promise
});

পার্সের নিজস্ব ব্লগ পোস্ট সম্পর্কে প্রশ্নগুলির সাথে পার্স প্রতিশ্রুতি ব্যবহারের আরও উদাহরণ আপনি দেখতে পাচ্ছেন ।


আপনি কি আমাকে বলতে পারেন এর সমর্থন কি? আইই 9 এটি সমর্থন করে?
স্যান্ড্রিনা-পি

হ্যাঁ, তবে পার্সে নিজেই বেশিরভাগ মৃত তাই সেখানে @SandrinaPereira রয়েছে। এটি পার্স ক্লাউড কোড।
বেনিয়ামিন গ্রুইনবাউম

1
আহ তাই না শুধুমাত্র খাঁটি জাভাস্ক্রিপ্ট? আমি এটি করার উপায় খুঁজছিলাম (অন্যটি শুরু করার জন্য কোনও ফাংশন শেষ হওয়ার অপেক্ষা করুন) তবে কেবল খাঁটি জাভাস্ক্রিপ্ট
দিয়েই

প্রশ্নটি পার্স কোড সম্পর্কিত, প্রতিশ্রুতি নয়। প্রতিশ্রুতিগুলি যে কোনও ব্রাউজারে (একটি লাইব্রেরি সহ) কাজ করতে পারে। ব্লুবার্ড আইই 6 এবং নেটস্কেপ 7 এ
চলেছে

1
আমি এখন দু'দিন ধরে এসও পড়ছি, এবং এখনও, কেউই এর সমাধান করেনি। এই গৃহীত উত্তরটি প্রতিটি অন্যান্যর মতো। ফাংশনটি প্রতিশ্রুতি দেয়, অপের অনুরোধ অনুসারে কোনও মান দেয় না। কেন এই উত্তর গৃহীত হিসাবে চিহ্নিত করা হয়েছে?
আইজানজা

19

প্রতিশ্রুতির ফলাফলের জন্য এই ফাংশনটি অপেক্ষা করতে আমার কী করা দরকার?

ব্যবহারের async/await(না ECMA6 পার্ট, কিন্তু Chrome এজ, ফায়ারফক্স এবং 2017 পর থেকে সাফারি জন্য উপলব্ধ দেখতে canIuse )
MDN

    async function waitForPromise() {
        // let result = await any Promise, like:
        let result = await Promise.resolve('this is a sample promise');
    }

মন্তব্যের কারণে যুক্ত করা হয়েছে: একটি অ্যাসিঙ্ক ফাংশন সর্বদা একটি প্রতিশ্রুতি দেয় এবং টাইপসক্রিপ্টে এটি দেখতে দেখতে পছন্দ করে:

    async function waitForPromise(): Promise<string> {
        // let result = await any Promise, like:
        let result = await Promise.resolve('this is a sample promise');
    }

4
অ্যাসিঙ্ক ফাংশনটি যদি অপেক্ষা না করে ডাকা হয় (বা অ্যাসিঙ্ক্রোনাস কোডে না থাকে) এখনও প্রতিশ্রুতিযুক্ত অবজেক্টটি ফিরিয়ে দেবে। আপনি যদি অনিশ্চিত হন তবে কনসোল.লগ (ওয়েটফরম প্রমিজ ()) এর ফলাফল দেখুন। কনসোল.লগ (একটি ফলাফল) এর একটি অ্যাসিঙ্ক ফাংশনের মধ্যে ফলাফল যা প্রত্যাশা করে তা মুদ্রণ করবে , তবে অ্যাসিঙ্ক ফাংশন থেকে প্রত্যাবর্তনটি অবরুদ্ধ হয়ে অবিলম্বে ঘটে এবং কোনও প্রতিশ্রুতি ফিরে দেয়। জাভাস্ক্রিপ্টে ব্লক করা সাধারণত খুব খারাপ হয় কারণ এটি একটি একক থ্রেডেড অ্যাপ্লিকেশন এবং ব্লক করা অন্য যে কোনও পাব / সাব ক্লায়েন্টের বিজ্ঞপ্তিগুলি অনাহারে ফেলবে তা মূলত পুরো অ্যাপটিকে হাঁটুতে আনবে।
এসআরএম

1
.NET এর কাছে টাস্ক ক্লাসের মতো "প্রতিশ্রুতি" দেওয়া আছে। জাভাস্ক্রিপ্ট কি এই বৈশিষ্ট্যটি হারিয়েছে? আমার নোড কমান্ড-লাইন সরঞ্জামটি বের করার আগে আমাকে এমন কিছু অপেক্ষা করতে হবে যা এর সরঞ্জামটিকে অন্য সরঞ্জামে পাইপ করতে পারে। "অপেক্ষা" কেবলমাত্র async ফাংশনগুলির মধ্যে কাজ করে। অর্থ এটি কোনও প্রতিশ্রুতির সুযোগের বাইরে কাজ করে না।
তমুসজেয়ার্স

@ এসআরএম আমি আপনার মন্তব্যটি নমুনার ভুল ব্যাখ্যার উপর ভিত্তি করে মনে করছি - এটি "অভ্যন্তরীণ" প্রতিশ্রুতি সম্পর্কিত res তাই আমি উত্তরটি আপডেট করার সিদ্ধান্ত নিয়েছি।
মার্টিন মিজার

@ টিমুসজেয়েস অনুমান যে এটি নিজেই একটি প্রশ্ন তবে আমি মনে করি সি # তে আপনি Task.ContinueWith (Task) ব্যবহার করতে পারেন, যা আপনি গ্রহণযোগ্য উত্তরে দেখতে পাবেন একই ধারণা (যেখানে এটি "তখন ()" বলা হয়)।
মার্টিন মিজার 7:58

আমার মনে হয় আমি এখন দেখছি। আমি আমার সম্পূর্ণ স্ক্রিপ্টটি বিশাল এক অ্যাসিঙ্ক ফাংশনে মুছতে পারি। এবং সেই ফাংশনটিকে আমার স্ক্রিপ্টের শেষ লাইন হিসাবে কল করুন। সেই ফাংশনটি এখনও কিছুটা বয়লার প্লেট হতে পারে। আমি আগে বুঝতে চেয়ে কম উপায়। আমি ফাংশন মধ্যে ফাংশন লিখতে অভ্যস্ত না। আপনাকে ধন্যবাদ! মার্টিনমিজার!
TamusJRoyce

3

আপনি ফাংশনটি অপেক্ষা করতে চাইবেন না, কারণ জাভাস্ক্রিপ্টটি অবরুদ্ধ নয় to পরিবর্তে ফাংশন শেষে প্রতিশ্রুতি ফিরে, তারপরে কলিং ফাংশন সার্ভার প্রতিক্রিয়া পেতে প্রতিশ্রুতি ব্যবহার করতে পারেন।

var promise = query.find(); 
return promise; 

//Or return query.find(); 

1
success:বিট সহ আপনার পুরো কলব্যাক জিনিসটি বন্ধ।
বেনিয়ামিন গ্রুইনবাউম

বা ভাল: return query.find();
ম্যাশ করুন

ঠিক আছে। আমি কেবল উদাহরণস্বরূপ এটির জন্য এটি ছেড়ে দেব তবে এটি মন্তব্য হিসাবে যুক্ত করব।
ট্রেস করুন

আমি এটি চেষ্টা করেছিলাম তবে ফলাফলগুলি অপরিজ্ঞাত বলে মনে হচ্ছে। রেজাল্টবাইনেম ("নাম")। তারপরে (ফাংশন (ফলাফল) so কনসোল.লগ ("অ্যারেটি পেলাম" + ফলাফল।
mac_55

1
ধন্যবাদ, ফলাফল ফাংশনটির ভিতরে অবশ্যই কোনওরকম ত্রুটি ঘটেছে। এটা এখন কাজ করছে. আমি আমার
কনসোল.লগকে ফলাফলের দৈর্ঘ্যে

2

আপনি এখানে প্রতিশ্রুতি ব্যবহার করছেন না আসলে। পার্স আপনাকে কলব্যাক বা প্রতিশ্রুতি ব্যবহার করতে দেয়; তোমার পছন্দ.

প্রতিশ্রুতি ব্যবহার করতে, নিম্নলিখিতটি করুন:

query.find().then(function() {
    console.log("success!");
}, function() {
    console.log("error");
});

এখন, প্রতিশ্রুতি শেষ হওয়ার পরে জিনিসগুলি সম্পাদন করতে, আপনি কেবলমাত্র এটি ভিতরে প্রতিশ্রুতি কলব্যাকের মধ্যে সম্পাদন করতে পারেন then() কলের । এখনও অবধি এটি নিয়মিত কলব্যাকের মতোই হবে।

প্রতিশ্রুতিগুলির সত্যিকারের সদ্ব্যবহার করা হ'ল আপনি যখন এইগুলি শৃঙ্খলাবদ্ধ হন:

query.find().then(function() {
    console.log("success!");

    return new Parse.Query(Obj).get("sOmE_oBjEcT");
}, function() {
    console.log("error");
}).then(function() {
    console.log("success on second callback!");
}, function() {
    console.log("error on second callback");
});

ফলাফল অবজেক্টটি কোন ধরণের অবজেক্ট? এটিতে আমার অ্যারে রয়েছে বলে মনে হচ্ছে না
mac_55

এটির একটি অ্যারে হওয়া উচিত Parse.Object
ম্যাশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.