保存的javascript facebook API响应仍然未定义?

保存的javascript facebook API响应仍然未定义?,javascript,asynchronous,d3.js,callback,facebook-javascript-sdk,Javascript,Asynchronous,D3.js,Callback,Facebook Javascript Sdk,我怀疑这是异步性的问题, 我就是想不起来有什么问题。 所以我发出多个api请求,并用响应填写一个列表。 然后我有一个D3.js脚本来绘制数据, 虽然接收到未定义的,但我在这里用一个简单的日志替换了它。 (当然,控制台稍后会实时“评估”这些值,但记录节点[0]项确实是未定义的。) 我测试了为后续脚本设置超时,但没有效果, 由于请求失败,我无法提出回调解决方案 它本身已经是一个回调。 (我知道在这里使用forEach是合适的方法,但我也在尝试让赋值函数立即返回,这也是我还无法实现的) 我怀疑这是异步

我怀疑这是异步性的问题, 我就是想不起来有什么问题。 所以我发出多个api请求,并用响应填写一个列表。 然后我有一个D3.js脚本来绘制数据, 虽然接收到未定义的,但我在这里用一个简单的日志替换了它。 (当然,控制台稍后会实时“评估”这些值,但记录节点[0]项确实是未定义的。) 我测试了为后续脚本设置超时,但没有效果, 由于请求失败,我无法提出回调解决方案 它本身已经是一个回调。 (我知道在这里使用
forEach
是合适的方法,但我也在尝试让赋值函数立即返回,这也是我还无法实现的)

我怀疑这是异步性的问题

当然,您的console.log可以并且将在
.api
完成之前启动。试图用
setTimeout
来延迟它只是一个糟糕的编程(这是一个猜测游戏)

节点上的任何处理
都需要在
.api
回调中进行。如果您正在触发多个异步调用,并且需要在处理
节点之前完成所有调用,那么您应该使用类似的方法。从文档中(以粗体显示):

队列评估零个或多个具有可配置并发性的延迟异步任务:您可以控制同时运行的任务数量当所有任务完成或出现错误时,队列将结果传递给等待回调。这个库类似于Async.js的并行(当并发为无穷大时)、串行(当并发为1时)和队列,但其占用空间要小得多:从第2版开始,d3队列大约有700字节被压缩,而异步队列只有4300字节

在您的情况下,代码可能如下所示(未经测试):

我怀疑这是异步性的问题

当然,您的console.log可以并且将在
.api
完成之前启动。试图用
setTimeout
来延迟它只是一个糟糕的编程(这是一个猜测游戏)

节点上的任何处理
都需要在
.api
回调中进行。如果您正在触发多个异步调用,并且需要在处理
节点之前完成所有调用,那么您应该使用类似的方法。从文档中(以粗体显示):

队列评估零个或多个具有可配置并发性的延迟异步任务:您可以控制同时运行的任务数量当所有任务完成或出现错误时,队列将结果传递给等待回调。这个库类似于Async.js的并行(当并发为无穷大时)、串行(当并发为1时)和队列,但其占用空间要小得多:从第2版开始,d3队列大约有700字节被压缩,而异步队列只有4300字节

在您的情况下,代码可能如下所示(未经测试):


您可以将请求包装在承诺中。然后等待所有承诺都得到解决,在这种情况下,您的nodes变量将充满响应。 你可以这样做:

nodes=[];
function sendRequest( variable ) {
    return new Promise ( ( resolve, reject ) => {
        FB.api("/"+variable,"GET",{fields:'name,picture.type(large),engagement'},function(response){
           if(!response.error)
                 resolve( response );
        });
    });
}

Promise.all( variables.map(function( variable ) {
    return sendRequest( variable ); 
})).then( values => {
     /* All the responses are solved here */
     nodes = values.splice( 0 );
     console.log(  nodes );
});

您可以将请求包装在承诺中。然后等待所有承诺都得到解决,在这种情况下,您的nodes变量将充满响应。 你可以这样做:

nodes=[];
function sendRequest( variable ) {
    return new Promise ( ( resolve, reject ) => {
        FB.api("/"+variable,"GET",{fields:'name,picture.type(large),engagement'},function(response){
           if(!response.error)
                 resolve( response );
        });
    });
}

Promise.all( variables.map(function( variable ) {
    return sendRequest( variable ); 
})).then( values => {
     /* All the responses are solved here */
     nodes = values.splice( 0 );
     console.log(  nodes );
});

使用async/await和一些修复(let、arrow函数等)的不同方法:

let variables=['pageid1','pageid2','pageid3'];
cosnt sendRequest=(变量)=>{
返回新承诺((解决、拒绝)=>{
FB.api('/'+变量,{字段:'name,picture.type(大),engagement'},(response)=>{
如果(!response.error){
决心(回应);
}否则{
拒绝(response.error);
}
});
});
};
const getData=async()=>{
让节点=[];
for(设i=0;i
使用异步/等待和一些修复(let、箭头函数等)的不同方法:

let variables=['pageid1','pageid2','pageid3'];
cosnt sendRequest=(变量)=>{
返回新承诺((解决、拒绝)=>{
FB.api('/'+变量,{字段:'name,picture.type(大),engagement'},(response)=>{
如果(!response.error){
决心(回应);
}否则{
拒绝(response.error);
}
});
});
};
const getData=async()=>{
让节点=[];
for(设i=0;i
Hi,谢谢你的提示,我从示例代码中删除了
setTimeout
,因为它也伤害了我的眼睛。D3也包含了这样一个函数,真是太棒了。我想我会深入研究它是如何工作的,以理解这个解决方案,或许可以提取一个本机解决方案。@bpstrngr,添加了一些示例代码来帮助您开始(不幸的是,它未经测试)嗨,谢谢你的提示,我从示例代码中删除了
setTimeout
,因为它也伤害了我的眼睛。D3也包含了这样一个函数,真是太棒了。我想我将深入了解它是如何工作的,以理解解决方案,并可能提取一个本机解决方案。@bpstrngr,添加了一些示例代码以帮助您开始(不幸的是,它未经测试)
nodes=[];
function sendRequest( variable ) {
    return new Promise ( ( resolve, reject ) => {
        FB.api("/"+variable,"GET",{fields:'name,picture.type(large),engagement'},function(response){
           if(!response.error)
                 resolve( response );
        });
    });
}

Promise.all( variables.map(function( variable ) {
    return sendRequest( variable ); 
})).then( values => {
     /* All the responses are solved here */
     nodes = values.splice( 0 );
     console.log(  nodes );
});
let variables = ['pageid1', 'pageid2', 'pageid3'];
cosnt sendRequest = (variable) => {
    return new Promise ((resolve, reject) => {
        FB.api('/' + variable, {fields:'name,picture.type(large),engagement'}, (response) => {
            if(!response.error) {
                resolve(response);
            } else {
                reject(response.error);
            }
        });
    });
};

const getData = async () => {
    let nodes = [];
    for (let i = 0; i < variables.length; i++) {
        let response = await sendRequest(variables[i]);
        nodes.push(response);
    }
    console.log(nodes);
};

getData();