অভ্যন্তরীণ থেকে কোনও প্রতিশ্রুতি কীভাবে প্রত্যাখ্যান করবেন তারপরে কার্য করুন


86

এটি সম্ভবত একটি নির্বোধ প্রশ্ন, তবে মাঝের প্রতিশ্রুতি শৃঙ্খলা, আপনি তত্কালীন কোনও একের ভিতরে থেকে কোনও প্রতিশ্রুতি কীভাবে প্রত্যাখ্যান করবেন? উদাহরণ স্বরূপ:

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

মূল সমাধান / প্রত্যাখ্যান ফাংশন বা প্রোমিসারসোলভারটির আর কোনও রেফারেন্স নেই। আমি কি যোগ করার কথা বলছি return Promise.reject(validationError);?


4
throw validationError
কাভুন

> <আমার অনুভূতি ছিল এটি মূর্খ / সহজ কিছু হবে। অনুমান আমি ভাবতে থাকলাম যে আমাকে একটি উত্সর্গীকৃত প্রত্যাখ্যান ফাংশনটি কল করতে হবে বা তার পরিবর্তে একটি ব্যর্থ প্রতিশ্রুতি ফিরিয়ে আনতে হবে। সুতরাং কোনও প্রতিশ্রুতি / ততক্ষণের ভিতরে থেকে, কোনও প্রত্যাশিত মান যা কোনও নতুন প্রতিশ্রুতি নয়, তা সমাধান হওয়া মান হিসাবে বিবেচিত হবে? এবং যদি আমি কোনও ত্রুটি ফেলে দিই তবে তা অবিলম্বে প্রত্যাখ্যাত প্রতিশ্রুতি ফিরিয়ে দেওয়ার মতো? আপনি যদি উত্তর হিসাবে পোস্ট করেন তবে আমি তা গ্রহণ করব।
চিনাবুফেট

আপনি সম্ভবত এখানে গৃহীত উত্তর খুঁজছেন stackoverflow.com/questions/17800176/…
ক্র্যাড

উত্তর:


96

আমি কি যোগ করার কথা বলছি return Promise.reject(validationError);?

হ্যাঁ. তবে, এটি কেবল জিকুয়েরিতে জটিল , একটি প্রতিশ্রুতি / এ + -কম্প্লিয়েন্ট লাইব্রেরি সহ আপনি সহজেই পারেন

throw validationError;

সুতরাং আপনার কোডটি এর মতো দেখতে হবে

someActionThatReturnsAPromise()
    .then(modifyResource)
    .then(function(modifiedResource) {
        if (!isValid(modifiedResource))
            throw getValidationError(modifiedResource);
        // else !
        return modifiedResource;
    })
    .catch(function() {
        // oh noes
    });

4
এটি কি নিয়মিত জিনিস? এটি কি বহুল ব্যবহৃত হয়? এটি করতে আমার খারাপ লাগছে, কারণ কোডটিতে কোথাও না পাওয়া .catchগেলে পুরো অ্যাপটি অযাচিত ত্রুটি দিয়ে উড়িয়ে দেবে ..
আন্দ্রে পোপভ

4
মনে রাখবেন যে প্রতিশ্রুতি / এ + অনুবর্তী লাইব্রেরিতে আপনি থ্রো ব্যবহার করতে পারেন কারণ handlerফর thenসিঙ্ক হয় এবং ব্যতিক্রমটি ক্যাচ করা যায়। যদি হ্যান্ডলারটি অ্যাসিঙ্ক হয় তবে অবশেষে প্রত্যাখ্যান করার প্রতিশ্রুতি ফিরে আসতে হবে। সুতরাং সর্বদা নিক্ষেপের পরিবর্তে Promise.reject () ফিরিয়ে দেওয়া আমার বোধগম্য হয়। কারণ আপনি যদি অ্যাসিঙ্ক হ্যান্ডলারটি ফেলে থাকেন তবে গ্রন্থাগারটি এটি ধরতে পারে না এবং এটি নিঃশব্দে পাস হবে। সাবধান!
মাইক গ্লিসন জুনিয়র কৌতুরিয়ার

4
@ মাইকগ্লেসনজরকৌতুরিয়ার: এমন কোনও অ্যাসিঙ্ক হ্যান্ডলার নেই যা .thenকোনও প্রতিশ্রুতিতে হ্যান্ডলার নয় :-) আপনি যদি কোনও প্রমিসফাইড না হওয়া এপিআই ব্যবহার করেন, তবে এমনকি return Promise.reject()আপনাকে সহায়তা করবে।
বার্গি

@ বেরগি আমার মত অর্থ: p.then(function() { doAsync(function() { throw new Error("won't catch"); }); }); সম্পাদনা করুন: ওহ ঠিক আছে আমি আপনার মন্তব্যটি পুনরায় পড়েছি, আমি সম্পূর্ণ আপনার সাথে আছি, আমরা একই পৃষ্ঠায় আছি! আমি এটি ওপিকে তুলে ধরতে চেয়েছিলাম :)
মাইক গ্লিসন জুনিয়র কৌতুরিয়ার

4
@ মাইক গ্লেসনজার জিআর কাউউটুরিয়ার: হ্যাঁ, আমি যা বলছিলাম ঠিক তেমনটাই। এবং doAsync(function() { return Promise.reject(new Error("won't catch, won't throw")); })সেখানে কাজ করে না - এটি নিঃশব্দে ব্যর্থ হয়। doAsync().then(function() { throw new Error("will be caught"); })আপনি যখন প্রতিশ্রুতি নিয়ে কাজ করছেন তখন এটি সত্যই হওয়া উচিত ।
বার্গি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.