我过去一直在努力,今天一直在努力的事情是阻止API / AJAX继续进行,直到您收到响应为止。目前,我正在使用Facebook API。我需要从调用中获取响应,然后将其返回,但是正在发生的事情是,在我从未从API调用中获取响应之前,我的函数正在返回。我知道为什么会这样,我只是想不出如何预防!这是我的代码…
function makeCall(){ var finalresponse = ""; var body = 'Test post'; FB.api('/me/feed', 'post', { message: body }, function(response) { if (!response || response.error) { finalresponse = response.error; } else { finalresponse = 'Post ID: ' + response.id; } }); return finalresponse; }
// -----编辑
我注意到有人建议这样的事情…
function makeCall(){ var finalresponse = ""; FB.api('/me/feed', 'post', { message: body }, function(response) { if (!response || response.error) { finalresponse = response.error; return finalresponse; } else { finalresponse = 'Post ID: ' + response.id; return finalresponse; } }); }
但这返回未定义
//根据更新进行编辑
function share_share(action_id){ var finalresponse = makeCall(action_id, process); return finalresponse; } function makeCall(action_id, callback){ var body = 'Test post'; FB.api('/me/feed', 'post', { message: body }, function (response) { if (!response || response.error) { var finalresponse = response.error; } else { finalresponse = 'Post ID: ' + response.id; } callback(action_id, finalresponse); }); } function process(action_id, finalresponse){ console.log(finalresponse); }
每天要问100次并且似乎不可能有一个答案的问题。
该调用是异步的,因此不可能一步完成。您期望的基本示例。
function one() { var a = 1; return a; } alert( one() );
实际发生了什么:
function one() { var a; window.setTimeout( function() { a = 1; }, 2000); return a; //This line does not wait for the asynchronous call [setTimeout/ajax call] to run. It just goes! } alert( one() );
您需要做的是将其分为两部分。
function one( callback ) { window.setTimeout( function(){ //acting like this is an Ajax call var a = 1; callback(a); },2000); } function two( response ) { alert(response); } one( two );
因此,在您的情况下,您需要分解代码以分两个部分来处理它。
function makeCall( callback ) { var body = 'Test post'; FB.api('/me/feed', 'post', { message: body }, function (response) { if (!response || response.error) { var finalresponse = response.error; } else { finalresponse = 'Post ID: ' + response.id; } callback(finalresponse); }); } function processResponse( response ) { console.log(response); } makeCall(processResponse);