2017-11-24 1 views
2

내 코드에 $.when apply을 사용하려고합니다. 그러나 형식 반환은 단일 및 다중 요청에 대해 다른 것 같습니다. 나는 그것을 어떻게 먹을 수 있니? 나는 그 밖의 다른 것이 없다면 노력하고 있습니다.

$.when.apply(null, apiRequestList).then(function() { 
    for (var i = 0; i < arguments.length; i++) { 
     var value = arguments[0]; 
    } 
}); 

이것은 내가 원하지 않는 것입니다.

if (apiRequestList.length === 1) { 
    $.ajax({ 

    }); 
} else { 
    $.when.apply(null, apiRequestList).then(function() { 
     for (var i = 0; i < arguments.length; i++) { 
      var value = arguments[0]; 
     } 
    }); 

} 
+0

당신이 염려하는 점이 무엇인지는 분명하지 않습니다. '$ .when()'에서 반환 된 객체는 단일 또는 다중 약속이 전달되는지 여부에 따라 다르지만, AFAIK는 후속 '.then' 콜백에 전달 된 결과 매개 변수는 항상 약속의 해결 된 값 목록이됩니다. – Alnitak

+0

'$ .when'을 삭제하고 대신'Promise.all'을 사용하십시오. – Bergi

답변

3
apiRequestList의 길이가 1 인 경우는 단순히 배열로 arguments을 변환 할 수 있습니다

:

function x(a) { 
    return $.post("/echo/html/", { 
    html: "a = " + a, 
    delay: Math.random() 
    }); 
} 
function doIt(apiRequestList) { 
    $.when.apply(null, apiRequestList).then(function() { 

     var _arguments = arguments; 
     if (Array.isArray(apiRequestList) && apiRequestList.length === 1) 
      _arguments = [arguments]; 

     for (var i = 0; i < _arguments.length; i++) { 
      var value = _arguments[i][0]; 
      console.log(value); 
     } 
     console.log("----"); 
    }); 
} 
doIt([x(1), x(2), x(3)]); 
doIt([x(4)]); 
: (우리는 스택 조각에 아약스를 할 수 없기 때문에)

$.when.apply(null, apiRequestList).then(function() { 

    var _arguments = Array.prototype.slice.call(arguments); 
    if (Array.isArray(apiRequestList) && apiRequestList.length === 1) 
     _arguments = [arguments]; 

    for (var i = 0; i < _arguments.length; i++) { 
     var value = _arguments[i][0]; 
     console.log(value); 
    } 
}); 

Live Example on jsFiddle

출력 예 (Math.random()으로 인해 달라질 수 있음) :

 
a = 4 
---- 
a = 1 
a = 2 
a = 3 
---- 
+1

더 좋지 않을까요 :'_arguments = Array.prototype.slice.call (arguments);'? –

+0

@ A.Wolff 필요하지 않다면,'arguments'를 반복 할 수 있습니다. – Bergi