[javascript] 약속에 onFulfilled에 대한 여러 가지 주장이있을 수 있습니까?

여기에 있는 사양을 따르고 있으며 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]);
});