2013-07-31 1 views
15

모든 인수를 전달하는 데 문제가 있습니다. 내 약속 콜백은 세 가지 대신 하나만받습니다.자바 스크립트가 모든 인수를 전달하지 않는다는 약속 (Q 사용)

var asyncFunction= function(resolve) { 
    setTimeout(function() { 
     resolve("Some string that is passed", "and another", "third"); 
    }, 1000); 
}; 

var promiseFunction = function() { 
    var deferred = Q.defer(); 

    asyncFunction(deferred.resolve); 

    return deferred.promise; 
}; 

promiseFunction().then(function() { 
    // Only one argument is passed here instead of 3 
    // { '0': 'Some string that is passed' } 
    console.log(arguments); 
}); 

내가 뭘 잘못하고 있는지 아시겠습니까?

+0

내 돈이 타입 강제로 –

답변

12

Q 약속은 하나의 인수만으로 resolve d 일 수 있습니다. 약속은 하나의 단일 값을 나타내며 컬렉션은 아닙니다. 여러 값이 필요할 경우 명시 적으로 배열에 넣으십시오. 다중 매개 변수 콜백의 경우 .spread()을 사용할 수 있습니다.

+1

어떻게 가능합니까? 여러 개의 인수를 반환하는 비동기 함수가있는 수천 개의 라이브러리가 있습니까? 그때 그들은 사용할 수 있습니까? – Nick

+0

래퍼에서만 볼 수 있습니다. 특별한 점이 있습니까? – Bergi

+0

@Nick 전체 라이브러리는 단일 값 접근법을 중심으로합니다. [출처를 보시오] (https://github.com/kriskowal/q/blob/424dbd1f8c4a6a40a4b2c341598955b3880bfe79/q.js#L571) 여러 값을 지원하기 위해 어떤 변화가 필요한지 알아 내려고 노력하십시오. 실제 가치가 거의 없거나 전혀없는 상황에서 이것이 얼마나 복잡한 지 알게 될 것입니다. Bergi가 제안한 것처럼 배열을 사용하십시오. – Tomalak

2

동기 함수는 비동기와 동일한 방법으로 하나의 값만 반환합니다.

많은 값으로 해석되는 비동기 함수를 만드는 것은 좋지 않습니다. 많은 값을 전달하려면 array 또는 dict 객체로 반환하십시오. 지정된 함수가 동기식 일 경우와 같습니다.

+1

콜백을 사용하는 라이브러리가 많아 여러 개의 인수를 전달합니다. 나는이 나쁜 습관을 생각하지 않는다. 여러 가치를지지하는 약속/선물 또한 논리적 인 단계처럼 보입니다. 나는 이것이 [메일 링리스트 항목] (http : //lists.w3.조직/아카이브/공개/www-dom/2013AprJun/0059.html). – Matt

+0

Matt, 처음에는 라이브러리에서 나는 해상도를위한 여러 값을 허용하는 것으로 실험했지만, 나는 그 생각을 빨리 거부했다. 나는 정확한 문제를 기억하지 못한다. 그러나 나는 하나의 객체로서 해결 된 가치를 다루어야 할 때가 있었고, 배열이나 인자 객체를 항상 다루는 것은 이상했다. . 의사 결정은 이미 작성되었으며 실제로 실전에 적합하다는 것이 입증되었습니다. 보신 것처럼 링크 한 소식은 신속하게 게시되었습니다. 나는 그런 생각이 심각하게 고려 된 것을 기억하지 못합니다. –

+0

약속 라이브러리 (재미 있고 배우기 위해)를 쓰고 있기 때문에 걱정스러운 부분이 많아서 자연스러운 해결책이 될 것 같습니다. 공동체가 단일 가치로 정착했다면, 그렇 겠지요. 후속 조치 주셔서 감사합니다. – Matt

0

여러 값을 전달하려면 배열이나 개체와 같이 전달한 다른 단일 값으로 값을 래핑해야합니다.