我搜索了很长时间,虽然有很多关于类似关键字的问题,但是没有一个问题具有相同的复杂性,所以让我解释一下我的问题:
我有一个函数(getProjectData),有被调用(它是系统范围的东西)来从cms的特定管理部分获取所有数据。我的问题来自条件检查,如果一个对象是空白,如果是B,它需要包含超过1个ajax调用的结果。整个数据对象在此函数中重新调整。代码到目前为止:
function getProjectData() {
var code = "some id";
var frozen = true;
var obj = {
code: code,
frozen: true,
localData: "",
};
// here is the point where the object gets returned with a black localData
// or splits to get a few ajax calls
if ( !obj.frozen ) return obj;
else {
getLocalData ( code ).then( function ( data ) {
// ideally, here i would make the parent return obj, but this time with added localData data
obj.localData = data;
parent.return obj;
} );
}
}
function getLocalData ( code ) {
var promise = new Promise ( function ( resolve, reject ) {
var apiReq = "apiUrl";
var chartsReq = "anotherApiUrl";
var res;
$.when(
// api response
$.ajax({
url: apiReq + code,
type: "get",
success: function ( data ) {
return data;
},
error: function ( error ) {
return error;
}
}),
// another ajax call..
$.ajax({ ... }),
// another ajax call..
$.ajax({ ... })
).then(
function ( a, b, c ) {
data = {
response: a
...... for b and c
};
resolve ( data );
},
function ( error ) {
reject ( error );
}
);
} );
return promise.then(
function (data) {
return data;
},
function ( error ) {
console.log ( error );
}
);
}
我的问题是,因为(我也尝试过其他方式..)所有返回都在其他函数中的函数中,在添加localData之后无法返回Obj对象。
我可能过度设计了它,但我尝试了很多不同的方法,因为getProjectData被一个保存按钮调用,需要返回值而不是说,附加到DOM,我不知道该怎么做!< / p>
我知道在异步请求中,函数必须在结果可用之前返回,我们通常会使用回调,但回调将无法返回。我可以使用同步请求,但我知道它们将被弃用..
有什么想法吗?
答案 0 :(得分:0)
下面列出了调用函数的正确方法。
真诚地,我不明白你的意思:
//理想情况下,这里我会让父母返回obj,但这次添加了localData数据
在父母中使用以下方式,您应该调用:
getProjectData.then(function(obj){
//... do whatever
});
<强> JS:强>
function getProjectData() {
var code = "some id";
var frozen = true;
var obj = {
code: code,
frozen: true,
localData: "",
};
// here is the point where the object gets returned with a black localData
// or splits to get a few ajax calls
return new Promise(function(resolve, reject) {
if ( !obj.frozen )
resolve(obj);
else {
getLocalData ( code ).then( function ( data ) {
// ideally, here i would make the parent return obj, but this time with added localData data
obj.localData = data;
resolve(obj);
});
});
}
}
function getLocalData ( code ) {
var promise = new Promise ( function ( resolve, reject ) {
var apiReq = "apiUrl";
var chartsReq = "anotherApiUrl";
var res;
$.when(
// api response
$.ajax({
url: apiReq + code,
type: "get",
success: function ( data ) {
return data;
},
error: function ( error ) {
return error;
}
}),
// another ajax call..
$.ajax({ ... }),
// another ajax call..
$.ajax({ ... })
).then(
function ( a, b, c ) {
data = {
response: a
...... for b and c
};
resolve ( data );
},
function ( error ) {
reject ( error );
}
);
} );
return promise;
}