여기에 있는 사양을 따르고 있으며 onFulfilled를 여러 인수로 호출 할 수 있는지 확실하지 않습니다. 예를 들면 다음과 같습니다.
promise = new Promise(function(onFulfilled, onRejected){
onFulfilled('arg1', 'arg2');
})
내 코드는 다음과 같습니다.
promise.then(function(arg1, arg2){
// ....
});
모두받을 arg1
과를 arg2
?
구체적인 약속 구현이 어떻게 수행되는지는 신경 쓰지 않고 w3c 사양을 따르고 싶습니다.
답변
여기에있는 사양을 따르고 있으며 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', '!']);
답변
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]) => {
// ....
});
답변
약속의 이행 값은 함수의 반환 값과 유사하며 약속의 거부 이유는 던져진 예외 함수와 유사합니다. 함수는 여러 값을 리턴 할 수 없으므로 약속은 두 개의 이행 값을 가져서는 안됩니다.
답변
ES6 Promise 사양 과 표준 promise 사양을 읽으면 구현 이이 경우를 처리하지 못하게하는 조항은 없지만 다음 라이브러리에서는 구현되지 않습니다.
다중 인수 해결을 생략하는 이유는 순서를 더 간결하게 만드는 것입니다 (즉, 함수에서 하나의 값만 반환 할 수 있으므로 제어 흐름이 덜 직관적입니다).
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);
});
답변
다음은 CoffeeScript 솔루션입니다.
나는 동일한 해결책을 찾고 있었고이 답변에서 seomething이 매우 흥미로운 것을 발견했습니다 : AngularJS에서 여러 인수 (예 : $ http)로 약속 거부
이 사람 Florian 의 대답
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
답변
벤자민, 크리스 등의 훌륭한 질문과 훌륭한 답변-많은 감사합니다!
나는 이것을 프로젝트에서 사용하고 Benjamin Gruenwald의 코드를 기반으로 모듈을 만들었습니다 . npmjs에서 사용할 수 있습니다.
npm i -S promise-spread
그런 다음 코드에서
require('promise-spread');
다음과 같은 라이브러리를 사용하는 경우 any-promise
var Promise = require('any-promise');
require('promise-spread')(Promise);
다른 사람들도이 기능을 유용하게 사용할 수 있습니다!
답변
ES6에서 Destructuring Assignment가 도움이 될 것입니다.
let [arg1, arg2] = new Promise((resolve, reject) => {
resolve([argument1, argument2]);
});
