나는 일련의 함수 호출을 가지고 있고 async.waterfall을 사용한다. 그것은 매력처럼 작동합니다. 하지만 jQuery Deferred로 해보고 싶습니다. 내 코드를 변환하는 방법?async.waterfall 대신 jQuery Deferred 기능을 사용하는 방법?
jQuery 사이트의 예는 다음과 같습니다. 두 결과는 done
함수에 전달됩니다
$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1, a2) {
// a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively.
// Each argument is an array with the following structure: [ data, statusText, jqXHR ]
var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It"
if (/Whip It/.test(data)) {
alert("We got what we came for!");
}
});
하지만 내 코드는 다르다. waterfall
의 모든 단계에 콜백을 전달해야하며 콜백에 if
이 있습니다. jQuery로 구현하는 방법은 무엇입니까? 가능한가?
async.waterfall([
function(cb) {
VK.Api.call('users.get', {user_ids: res.session.mid, fields: fields}, function(userDataRes) {
cb(null, userDataRes);
});
},
function(userDataRes, cb) {
if(userDataRes.response[0].city) {
VK.Api.call('database.getCitiesById', {city_ids: userDataRes.response[0].city}, function(cityDataRes) {
cb(null, userDataRes, {city: cityDataRes.response[0].name});
});
}
else {
cb(null, userDataRes, {});
}
},
function(userDataRes, cityDataRes, cb) {
if(userDataRes.response[0].country) {
VK.Api.call("database.getCountriesById", {country_ids: userDataRes.response[0].country}, function(countryDataRes) {
cb(null, userDataRes, cityDataRes, {country: countryDataRes.response[0].name});
});
}
else {
cb(null, userDataRes, {}, {});
}
},
function(userDataRes, cityDataRes, countryDataRes, cb) {
var resObj = $.extend(true, {}, userDataRes.response[0], cityDataRes, countryDataRes);
cb(null, resObj);
},
],
function(err, res) {
console.log("res::: ", res);
}
);
UPD 1 :
그래서, 나는 해결책을 구현했지만, 예상대로 작동하지 않습니다. .then()
에 비동기식 API 함수 호출이 있으며 jQuery 지연된 플로우가 거기에서 중단되었습니다. .then()
함수를 API 콜백으로 만드는 방법을 모르겠습니다.
var dfr = $.Deferred();
dfr.then(function(val) {
// THIS is an asynchronous API function call. And its callback returns result that is passed to the next .then()
// But jQuery deferred flow doesn't follow this API call.
// It goes along to the next .then ignoring this API call.
// How to make it enter this API call and be returned from a API's callback.
VK.Api.call('users.get', {user_ids: res.session.mid, fields: fields}, function(userDataRes) {
// cb(null, userDataRes);
console.log("countryDataRes: ", userDataRes);
return userDataRes;
});
}).
then(function(userDataRes) {
console.log("countryDataRes: ", userDataRes);
if(userDataRes.response[0].city) {
VK.Api.call('database.getCitiesById', {city_ids: userDataRes.response[0].city}, function(cityDataRes) {
// cb(null, userDataRes, {city: cityDataRes.response[0].name});
return [userDataRes, {city: cityDataRes.response[0].name}];
});
}
else {
// cb(null, userDataRes, {});
return [userDataRes, {}];
}
}).
then(function(aRes) {
if(aRes[0].response[0].country) {
VK.Api.call("database.getCountriesById", {country_ids: aRes[0].response[0].country}, function(countryDataRes) {
// cb(null, userDataRes, cityDataRes, {country: countryDataRes.response[0].name});
return [aRes[0], aRes[1], {country: countryDataRes.response[0].name}];
});
}
else {
cb(null, aRes[0], {}, {});
}
}).
then(function(aRes) {
var resObj = $.extend(true, {}, aRes[0].response[0], aRes[1], aRes[2]);
console.log("cityDataRes: ", aRes[1]);
console.log("countryDataRes: ", aRes[2]);
cb(null, resObj);
return resObj;
}).
done(function(res) {
console.log("res::: ", res);
});
dfr.resolve();
@DevlshOne, 그게 내가 지금하려는 것입니다. 그러나 jQuery에는이 작업에 대한 구현 패러다임이 다릅니다. 그리고 나는 그것을 어떻게하는지 이해할 수 없다. 나는 준비된 결과, 단서를 요구하지 않고있다. 그러니 그 일에 대해 어떤 단서를 주시겠습니까? 아니면 비난을 치를 수 있습니까? – Green
"단서"는 jQuery 팀이'.when()'메소드를 사용하는 방법에 대한 예제입니다. 그것을 구현하려는 시도를 보여 주면 비난이 줄어들 것입니다. – DevlshOne