প্রতিশ্রুতিগুলিতে অনুলিপি পূরণে একাধিক যুক্তি থাকতে পারে?


127

আমি এখানে অনুমানটি অনুসরণ করছি এবং আমি নিশ্চিত নই যে এটি একাধিক যুক্তি দিয়ে পূরণ করার অনুমতি দেয় কিনা। উদাহরণ স্বরূপ:

promise = new Promise(function(onFulfilled, onRejected){
    onFulfilled('arg1', 'arg2');
})

যেমন আমার কোড:

promise.then(function(arg1, arg2){
    // ....
});

উভয়ই পাবেন arg1এবং arg2?

কোনও নির্দিষ্ট প্রতিশ্রুতি বাস্তবায়ন কীভাবে তা করে তা নিয়ে আমি মাথা ঘামাই না, আমি প্রতিশ্রুতিগুলির জন্য ডাব্লু 3 সি অনুচ্ছেদটি অনুসরণ করতে চাই।


একটি ইঙ্গিত হিসাবে, আমি খুঁজে পেয়েছি যে github.com/then/promise (যা একটি নগ্ন হাড় বাস্তবায়ন) ব্যবহার করে তা প্রমাণিত করে যে এটি আসলে ২ য় যুক্তি সরবরাহ করে না
বাদুঙ্ক

2
আপনি স্প্রেড দিয়ে ব্লুবার্ড ব্যবহার করতে চান। - এছাড়াও, স্পেকটির প্রতি যত্নশীল হওয়া বন্ধ করুন, নকশাটি বাস্তবায়নের মধ্যে ইন্টারপ সম্পর্কে এবং নকশা অনুসারে এটি ন্যূনতম।
বেনিয়ামিন গ্রুইনবাউম

উত্তর:


130

আমি এখানে অনুমানটি অনুসরণ করছি এবং আমি নিশ্চিত নই যে এটি একাধিক যুক্তি দিয়ে পূরণ করার অনুমতি দেয় কিনা।

নাহ, কেবলমাত্র প্রথম প্যারামিটারটি প্রতিশ্রুতিবদ্ধ কনস্ট্রাক্টরের রেজোলিউশন মান হিসাবে বিবেচিত হবে। আপনি কোনও বস্তু বা অ্যারের মতো সংমিশ্রিত মান দিয়ে সমাধান করতে পারেন।

কোনও নির্দিষ্ট প্রতিশ্রুতি বাস্তবায়ন কীভাবে তা করে তা নিয়ে আমি মাথা ঘামাই না, আমি প্রতিশ্রুতিগুলির জন্য ডাব্লু 3 সি অনুচ্ছেদটি অনুসরণ করতে চাই।

আমি বিশ্বাস করি যে আপনি ভুল বলেছেন। স্পেসিফিকেশনটি ন্যূনতম হতে ডিজাইন করা হয়েছে এবং প্রতিশ্রুতি পাঠাগারগুলির মধ্যে আন্তঃব্যবস্থাপনের জন্য নির্মিত হয়েছে। ধারণাটি এমন একটি উপসেট রয়েছে যা উদাহরণস্বরূপ ডোম ফিউচার নির্ভরযোগ্যভাবে ব্যবহার করতে পারে এবং গ্রন্থাগারগুলি গ্রাস করতে পারে। আপনি .spreadকিছুক্ষণের জন্য যা চান তা বাস্তবায়নের প্রতিশ্রুতি দিন । উদাহরণ স্বরূপ:

Promise.try(function(){
    return ["Hello","World","!"];
}).spread(function(a,b,c){
    console.log(a,b+c); // "Hello World!";
});

সঙ্গে Bluebird । আপনি যদি এই কার্যকারিতাটি চান তবে একটি সমাধান হ'ল এটি পলিফিল।

if (!Promise.prototype.spread) {
    Promise.prototype.spread = function (fn) {
        return this.then(function (args) {
            return Promise.all(args); // wait for all
        }).then(function(args){
         //this is always undefined in A+ complaint, but just in case
            return fn.apply(this, args); 
        });
    };
}

এটি আপনাকে করতে দেয়:

Promise.resolve(null).then(function(){
    return ["Hello","World","!"]; 
}).spread(function(a,b,c){
    console.log(a,b+c);    
});

স্বাচ্ছন্দ্যে মাতাল প্রতিশ্রুতি সঙ্গে । বা স্প্রেড ব্যবহার করুন যা এখন (2018) ব্রাউজারগুলিতে সাধারণ:

Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
  console.log(a,b+c);    
});

বা অপেক্ষা সহ:

let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);

2
নোট করুন যে অন্যান্য লিবারিও (কিউ এর মতো) .spreadব্লুবার্ডের মতো সমর্থন করে - কারণ এটি অনুমানের মধ্যে নেই, কোড এবং গ্রন্থাগারগুলির মধ্যে ইন্টারপ করার অনুমতি দেওয়ার জন্য অনুমিতটি ন্যূনতম রাখা সত্যিই একটি বড় ব্যাপার
বেনিয়ামিন গ্রুইনবাউম

দ্বিতীয় নোট - আপনি কিছু চিনি লাইব্রেরি সরবরাহ পরিচালনা করতে Promise.allকেবল ফাংশনটি প্রয়োগ করার আগে অ্যারেতে কল করতে চাইতে পারেন .then। এটি বাধ্যতামূলক নয়, তবে এটি সুন্দর।
বেনিয়ামিন গ্রুইনবাউম

1
প্রতিশ্রুতি.আল আপনার বাস্তবায়নের সাথে বাধ্যতামূলক, যদিও আপনি কেবল প্রয়োগটি পরিবর্তন করতে পারবেনreturn Promise.all(args).then(function(args){return fn.apply(this, args);})
এসাইলিজা

14
spreadএকটি স্টপগ্যাপ। ES6 ডেস্ট্রাকচারিং এবং বাকী / স্প্রেড অপারেটর প্রবর্তন করে, যা spreadপ্রত্যক্ষ প্রয়োজনের জন্য অপসারণ করে । .then(([a, b, c]) => {})
ক্রিস কোয়াল

3
@ ক্রিসকোয়াল নোট করুন যে স্প্রেড () স্পষ্টভাবে। সমস্ত () করে কিন্তু ES6 ধ্বংসাত্মক সিনট্যাক্সটি করে না -> ব্লুবার্ডজ
ডকস

66

আপনি E6 ধ্বংসগুলি ব্যবহার করতে পারেন:

অবজেক্ট ডেস্ট্রাকচারিং:

promise = new Promise(function(onFulfilled, onRejected){
    onFulfilled({arg1: value1, arg2: value2});
})

promise.then(({arg1, arg2}) => {
    // ....
});

অ্যারে ডেস্ট্রাকচারিং:

promise = new Promise(function(onFulfilled, onRejected){
    onFulfilled([value1, value2]);
})

promise.then(([arg1, arg2]) => {
    // ....
});

3
এই উত্তরটির সাথে একটি উদাহরণ সুন্দর এবং সহায়ক হবে !
রাহুল ভার্মা

19

একটি প্রতিশ্রুতি পূর্ণতা মান একটি ফাংশন এর রিটার্ন মান সমান্তরাল এবং একটি প্রতিশ্রুতি প্রত্যাখ্যান কারণ একটি ফাংশন এর নিক্ষিপ্ত ব্যতিক্রম সমান্তরাল। ফাংশনগুলি একাধিক মান ফেরত দিতে পারে না তাই প্রতিশ্রুতিগুলির 1 টিরও বেশি পূর্ণতা মান থাকতে হবে না।


4

যতদূর আমি ES6 প্রতিশ্রুতি বিশদ বিবরণ এবং মান প্রতিশ্রুতি স্পেসিফিকেশন পড়া এই মামলা পরিচালনা করতে কোনও প্রয়োগকে আটকাতে পারে না - যদিও এটি নিম্নলিখিত গ্রন্থাগারে প্রয়োগ করা হয়নি:

আমি ধরে নিয়েছি যে তাদের বহুতল আরগ রেজোলভগুলি বাদ দেওয়ার কারণটি হচ্ছে ক্রম পরিবর্তনকে আরও সংহত করা (যেমন আপনি কেবল কোনও ক্রিয়ায় একটি মান ফিরিয়ে দিতে পারেন এটি নিয়ন্ত্রণ প্রবাহকে স্বল্পতর স্বজ্ঞাত করে তুলবে) উদাহরণ:

new Promise(function(resolve, reject) {
   return resolve(5, 4);
})
.then(function(x,y) {
   console.log(y);
   return x; //we can only return 1 value here so the next then will only have 1 argument
})
.then(function(x,y) {
    console.log(y);
});

8
প্রশ্নগুলি বহু-মূল্যবান রেজোলিউশনগুলিকে সমর্থন করে না কারণ প্রতিশ্রুতি ফাংশন কলের ফলাফলের জন্য প্রক্সি হিসাবে কাজ করে তবে দূরবর্তী বস্তুর জন্য প্রক্সিও তৈরি করতে পারে। এই উভয় ক্ষেত্রেই একটি অ্যারে হ'ল যৌগিক মানের একমাত্র বুদ্ধিমান উপস্থাপনা। ES6 এ ডেস্ট্রাকচারিং এবং "স্প্রেড" যুক্তি যুক্ত করার সাথে বাক্য গঠনটি সত্যিই দুর্দান্ত হয়ে যায়। "স্প্রেড" পদ্ধতিটি একটি স্টপগ্যাপ।
ক্রিস কোয়াল

ঠিক আছে, আপনি কলব্যাক return Promise.of(x, y)থেকে সর্বদা কোনও স্কেলারের মান পরিবর্তে দিতে পারেন then
বার্গি

2

এখানে একটি কফিস্ক্রিপ্ট সমাধান।

আমি একই সমাধানটির সন্ধান করছিলাম এবং এই উত্তরটি থেকে খুব আন্তঃসম্পর্কিত কিছু পেয়েছিলাম: একাধিক যুক্তি (যেমন $ HTTP) দিয়ে প্রতিশ্রুতি প্রত্যাখ্যান করা

এই ছেলেটির উত্তর ফ্লোরিয়ান

promise = deferred.promise

promise.success = (fn) ->
  promise.then (data) ->
   fn(data.payload, data.status, {additional: 42})
  return promise

promise.error = (fn) ->
  promise.then null, (err) ->
    fn(err)
  return promise

return promise 

এবং এটি ব্যবহার করতে:

service.get().success (arg1, arg2, arg3) ->
    # => arg1 is data.payload, arg2 is data.status, arg3 is the additional object
service.get().error (err) ->
    # => err

হওয়া ->উচিত =>?
শারিলহোহমান

1
@ শেরিলহোমান ২০১৫ সালে ফিরে এগুলি কফিস্ক্রিপ্ট ( coffeescript.org/#intr Productions ) দিয়ে লেখা হয়েছিল, ES6 সিনট্যাক্স নয়। সরল তীর সরল ফাংশন ছিল এবং ফ্যাট তীরগুলি ES6 এর মতো প্রায় একই রকম (আমার ধারণা E ES6 ফ্যাট তীরগুলি কম বা কম কোফস্ট্রিপ্ট থেকে ধার করা হয়েছে)।
প্রবেশ

আপনি চাইলে @ শেরিলহোমান নির্দ্বিধায় ইসিএমএ-তে পোস্টটি সম্পাদনা করতে পারেন।
প্রবেশ

আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ. আমি কেবল এটি পরিষ্কার করার জন্য সম্পাদনা করব যে এটি একটি কফি স্ক্রিপ্ট সমাধান। এটির সাথে আপনার উত্তরটি কফিস্ক্রিপ্ট কোড ঘাঁটির জন্য কার্যকর এবং কার্যকর হতে পারে। আপনার সম্পাদনা করার অফারটির জন্য ধন্যবাদ, তবে: ১) আপনার সমাধানটি সম্পাদনা / ভঙ্গ করার ঝুঁকি নিয়ে আমি কফিস্ক্রিপ্টের সাথে যথেষ্ট পরিচিত নই ;-)। ২) আপনার কোডটি আধুনিক জেএসে অনুবাদ করার ক্ষেত্রে "আপনার উত্তরের মূল উদ্দেশ্য" থেকে বিচ্যুতি হিসাবে বিবেচনা করা উচিত, সুতরাং এটি 'সম্পাদনা' পর্যালোচনা পাস করা উচিত নয়। বরং, কেউ আপনার কোড অনুবাদ করে এমন একটি নতুন উত্তর পোস্ট করতে পারে so আদর্শভাবে, তারা তাদের উত্তরের অনুপ্রেরণা হিসাবে আপনার উত্তরে আবার লিঙ্ক করবে :-)
শেরিলহোমান

0

দুর্দান্ত প্রশ্ন, এবং বেনিয়ামিন, ক্রিস, এবং আল-এর দুর্দান্ত উত্তর - অনেক ধন্যবাদ!

আমি এটি একটি প্রকল্পে ব্যবহার করছি এবং বেঞ্জামিন গ্রুইনওয়াল্ডের কোডের ভিত্তিতে একটি মডিউল তৈরি করেছি । এটি এনপিএমজে পাওয়া যায়:

npm i -S promise-spread

তারপরে আপনার কোডে, করুন

require('promise-spread');

আপনি যেমন একটি লাইব্রেরি ব্যবহার করছেন any-promise

var Promise = require('any-promise');
require('promise-spread')(Promise);

অন্যরাও এটি দরকারী খুঁজে পেতে পারে!


0

ES6- এ ডি-স্ট্রাকচারিং অ্যাসাইনমেন্টটি এখানে সহায়তা করবে Ex

let [arg1, arg2] = new Promise((resolve, reject) => {
    resolve([argument1, argument2]);
});

0

যেহেতু জাভাস্ক্রিপ্টে ফাংশনগুলি যে কোনও সংখ্যক আর্গুমেন্টের সাথে কল করা যেতে পারে, এবং নথিতে onFulfilled()নীচের ধারা বাদে পদ্ধতির আর্গুমেন্টগুলিতে কোনও বিধিনিষেধ স্থাপন করে না , আমি মনে করি যে আপনি onFulfilled()যতক্ষণ প্রতিশ্রুতির মান হবেন ততক্ষণ পদ্ধতিতে একাধিক যুক্তি পাস করতে পারবেন I প্রথম যুক্তি

২.২.২.১ প্রতিশ্রুতি পূর্ণ হওয়ার পরে এটি অবশ্যই ডাকা হবে, প্রতিশ্রুতির মানটি তার প্রথম যুক্তি হিসাবে।


-1

নীচের নিবন্ধটি উদ্ধৃত করার জন্য, "" তারপরে "দুটি আর্গুমেন্ট লাগে, সাফল্যের মামলার জন্য একটি কলব্যাক এবং অন্যটি ব্যর্থতার ক্ষেত্রে case দুটিই alচ্ছিক, সুতরাং আপনি কেবল সাফল্য বা ব্যর্থতার ক্ষেত্রে কলব্যাক যোগ করতে পারেন।"

আমি যে কোনও মৌলিক প্রতিশ্রুতিমূলক প্রশ্নের জন্য সাধারণত এই পৃষ্ঠাটিতে সন্ধান করি, যদি আমি ভুল হয় তবে আমাকে জানান

http://www.html5rocks.com/en/tutorials/es6/promises/


1
এখানেই ভুল, new Promiseবাক্য গঠন হয়েছে function(resolve, error)যখন thenসিনট্যাক্স হয়েছে.then(function(arg) {
megawac

2
@ মেগাওয়াক এটি ঠিক সঠিকভাবে খারাপভাবে ফেলেছে - তবে দুটি (কখনও কখনও 3) যুক্তি গ্রহণ করে - এটি ঠিক অস্বাভাবিক
বেনজামিন গ্রুয়েনবাউম

@ বেনজামিন গ্রুয়েনবাউম এর সাথে রয়েছে.then(function(/*resolve args*/){/*resolve handler*/}, function(/*reject args*/){/*reject handler*/})
মেগাওয়াক

2
হ্যাঁ, আপনি যদি নিবিড়ভাবে পড়েন তবে এই উত্তরটি দাবি করছে - এই প্রশ্নের প্রসঙ্গে খুব কার্যকর নয় তবে ভুল নয়।
বেনিয়ামিন গ্রুইনবাউম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.