비동기 호출의 특징은
호출의 순서가 callback의 순서와 같다는 걸 보장하지 않는다.
그리고 비동기함수는 호출후 리턴을 받을 동안 기다리지 않고 바로 다음 로직으로 진행한다.
이 특징이 컴퓨터의 자원을 대기없이 최대한 활용하는 장점이기도 하다.
그러나 때때로 비동기호출은 하되, 호출 결과를 받고나서, 다음 로직이 작동되어야 하는 경우가 있다.
아래 로직이 그런 경우이다.
Grid의 각 row를 순회하면서 각각 ajax를 호출여 그 결과를 리턴받아 다시 해당 row에 반영하는 예시이다.
onSelVndrPfrm : function()
{
var me = this;
var _gridVndr = me.$.gridPanelVndr;
var _providerVndr = _gridVndr.getDataProvider();
_gridVndr.clearAllSort();
_gridVndr.clearAllFilter();
var _fnc = async function(data)
{
var _param = {};
_param.vd_cd = data.vd_cd;
_param.sg_cd = data.sg_cd;
_param.cpt_type_cd = me.rqh.cpt_type_cd;
var _ajax = new SCAjax();
_ajax.url = "/bp/pro/rfx/selVndrPfrm.do";
_ajax.body = _param;
let _promise = new Promise(function(resolve)
{
UT.request(_ajax, function(event)
{
var _result = event.target.lastResponse;
if (UT.isNotEmpty(_result))
{
var _data = {};
_data.slct_cnt = _result.slct_cnt;
_data.sbmt_cnt = _result.sbmt_cnt;
_data.part_cnt = _result.part_cnt;
resolve(_data);
}
});
});
return await _promise;
}
_providerVndr.getItems().forEach(function(data, index, array)
{
_fnc(data).then(function(value)
{
_providerVndr.setItemAt(index, value);
});
});
}
위 로직은 비동기인 ajax를 호출하지만 그 결과를 받고을때 까지 기다리다(await) 결과가 return되면(resolve)
호출한 함수(_fnc(data))로 다시 return하여 결과(value)를 받아(then)화면에 반영하는 예시이다.
아래의 두 예시는 결과가 같다.
function myDisplay() {
let myPromise = new Promise(function(resolve, reject) {
setTimeout(function() { resolve("I love You !!"); }, 3000);
});
myPromise.then(function(value) {
document.getElementById("demo").innerHTML = value;
});
}
async function myDisplay() {
let myPromise = new Promise(function(resolve, reject) {
setTimeout(function() { resolve("I love You !!"); }, 3000);
});
document.getElementById("demo").innerHTML = await myPromise;
}
async, await는 IE에서는 지원하지 않는다.
Javascript의 비동기
https://www.w3schools.com/js/js_async.asp
Dart의 비동기
https://blog.daonelab.com/post/45/1857/