ฉันทำตามข้อมูลจำเพาะที่นี่และฉันไม่แน่ใจว่าอนุญาตให้เรียก onFulfilled ด้วยอาร์กิวเมนต์หลายรายการหรือไม่
ไม่เพียงแค่พารามิเตอร์แรกเท่านั้นที่จะถือว่าเป็นค่าความละเอียดในตัวสร้างสัญญา คุณสามารถแก้ไขด้วยค่าผสมเช่นอ็อบเจ็กต์หรืออาร์เรย์
ฉันไม่สนใจว่าจะมีการดำเนินการตามสัญญาใด ๆ อย่างไรฉันต้องการทำตามข้อกำหนด w3c สำหรับคำสัญญาอย่างใกล้ชิด
นั่นคือสิ่งที่ฉันเชื่อว่าคุณคิดผิด ข้อกำหนดถูกออกแบบมาให้น้อยที่สุดและสร้างขึ้นเพื่อการทำงานร่วมกันระหว่างไลบรารีสัญญา แนวคิดคือการมีชุดย่อยที่ตัวอย่างเช่นฟิวเจอร์ส DOM สามารถใช้งานได้อย่างน่าเชื่อถือและไลบรารีสามารถใช้งานได้ การใช้งานตามสัญญาจะทำในสิ่งที่คุณขอ.spread
มาระยะหนึ่งแล้ว ตัวอย่างเช่น:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
ด้วยคราม วิธีแก้ปัญหาอย่างหนึ่งหากคุณต้องการฟังก์ชันนี้คือการเติมเต็ม
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', '!']);