Tôi đang theo dõi thông số kỹ thuật ở đây và tôi không chắc liệu nó có cho phép onFulfill được gọi với nhiều đối số hay không.
Không, chỉ tham số đầu tiên sẽ được coi là giá trị độ phân giải trong hàm tạo hứa hẹn. Bạn có thể giải quyết với một giá trị tổng hợp như một đối tượng hoặc mảng.
Tôi không quan tâm đến việc thực hiện bất kỳ lời hứa cụ thể nào, tôi muốn theo dõi thông số w3c để biết các lời hứa chặt chẽ.
Đó là nơi tôi tin rằng bạn đã sai. Đặc tả được thiết kế tối thiểu và được xây dựng để tương tác giữa các thư viện hứa hẹn. Ý tưởng là có một tập hợp con mà DOM tương lai có thể sử dụng một cách đáng tin cậy và các thư viện có thể tiêu thụ. Hứa hẹn thực hiện những gì bạn yêu cầu .spread
trong một thời gian bây giờ. Ví dụ:
Promise.try(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c); // "Hello World!";
});
Với Bluebird . Một giải pháp nếu bạn muốn chức năng này là polyfill nó.
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);
});
};
}
Điều này cho phép bạn làm:
Promise.resolve(null).then(function(){
return ["Hello","World","!"];
}).spread(function(a,b,c){
console.log(a,b+c);
});
Với lời hứa bản địa dễ dàng fiddle . Hoặc sử dụng mức độ phổ biến hiện nay (2018) trong các trình duyệt:
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
Hoặc đang chờ:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);