Javascript没有遵循正确的工作流程

时间:2016-01-15 16:05:53

标签: javascript facebook-graph-api facebook-javascript-sdk

所以,在Javascript中我只是做了一个简单的循环,它应该调用3次函数,但是它会在循环内执行3次,然后只调用函数3次。 任何关于为什么会这样的想法

 function latest_update() {
            for(var i = 1; i <= 3; i++) {
                var id = parseInt(document.getElementById("event_id"+i).innerHTML);
                alert("testing");
                document.getElementById("row_num").innerHTML = "" + i;
                FB.api("/" + id,
                    function (response) {
                        if (response && !response.error) {
                            var j = parseInt(document.getElementById("row_num").innerHTML);
                            alert(j);
                            document.getElementById("event_id"+j).innerHTML = response.name;
                        }
                    });
            }

        }

2 个答案:

答案 0 :(得分:1)

由于Javascript的单线程事件循环,请参阅: http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/

JS线程必须在为循环结束后排队的异步FB函数提供服务之前完成当前的执行上下文(在本例中为for循环)。

答案 1 :(得分:0)

您需要恢复代码。我用于HTTP请求的一个很好的设计模式是promise模式。使用promises,您可以实现代码来触发HTTP请求,等待所有结果进入,然后执行其他操作。像这样:

function doFBCall() {
  var promise = new Promise();
  FB.api('/' + id, function(response) {
    // do something
    ... 
    // Now resolve the promise
    promise.resolve(); 
    // Note: you should handle the error cases with promise.reject();
  });
  return promise;
};

var arrayOfPromises = [];
arrayOfPromises.push(doFBCall());
arrayOfPromises.push(doFBCall());
arrayOfPromises.push(doFBCall());

// Wait for all promises to finish
Promise.all(arrayOfPromises).then(function() {
  // All promises succeed
}).catch(function() {
  // One or more promises failed
});

不确定您是否使用Angular或Ember等框架,其中可以随时使用promise库。