2012-10-08 36 views
0

我有一个函数使用WCF服务(在SharePoint中)使用数据。该服务不会返回项目所需的特定字段,因此我使用SharePoint Client Object Model通过使用WCF服务返回结果中的ID来查询该字段。JavaScript循环中的回调导致问题

function LoadAllNews() { 
var listUrl = "/_vti_bin/ListData.svc/Pages"; 

$.getJSON(listUrl, 
function (data) { 
    $.each(data.d, 
     function (i, result) { 
      GetImageUrl(result.Id, function (image) { 
       $(ConstructHtml(image, result.Title, result.Path, result.Name)).appendTo("#News"); 
      }); 
     }); 
}); 

}

当调试result在这里,我总是得到项目以相同的顺序返回,但由于GetImageUrl异步执行的项目的查询并不以相同的顺序追加。大多数他们必须似乎有些时候是随机的时代,因为时间来获得图像变化:

function GetImageUrl(id, callback) { 
    var context = new SP.ClientContext(); 
    var items = context.get_web().get_lists().getByTitle('Pages').getItemById(id); 
    context.load(items); 

    context.executeQueryAsync(function() { 
     callback(items.get_item('PublishingRollupImage')); 
    }); 
} 

function ConstructHtml(imageUrl, title, path, name) { 
    var html = "" // a long html string.. 
    return html; 
} 

我可以在sharepoint.stackexchange张贴此,但观众更广泛的在这里和这更是一个问题如何用JavaScript处理这个比用SharePoint本身。

任何想法,我应该如何处理这个?我在想,像在LoadAllNews()中跳过图像,然后当附加所有项目时,使用JavaScript/jQuery为每个新闻项加载图像。

在此先感谢。

回答

0

Coordinating parallel execution in node.js。我会做这样的:

var getImages = []; 
var meta = []; 
$.each(data.d, 
    function (i, result) { 
    getImages.push(function(callback){ 
     GetImageUrl(result.Id, callback); 
    }); 
    meta.push({ 
     title : result.Title, 
     path : result.Path, 
     name : result.Name 
    }); 
}); 

fork(getImages,function(images) { 
    $.each(images,function(i,image){ 
     $(ConstructHtml(
      image, 
      meta[i].title, 
      meta[i].path, 
      meta[i].name 
    )).appendTo("#News"); 
    }); 
}); 

fork的实现很简单:它确实是这样,你想要什么

function fork (async_calls, shared_callback) { 
    var counter = async_calls.length; 
    var all_results = []; 
    function makeCallback (index) { 
    return function() { 
     counter --; 
     var results = []; 
     // we use the arguments object here because some callbacks 
     // in Node pass in multiple arguments as result. 
     for (var i=0;i<arguments.length;i++) { 
     results.push(arguments[i]); 
     } 
     all_results[index] = results; 
     if (counter == 0) { 
     shared_callback(all_results); 
     } 
    } 
    } 

    for (var i=0;i<async_calls.length;i++) { 
    async_calls[i](makeCallback(i)); 
    } 
} 

fork以上功能集,以异步结果。

0

如果事件问题的顺序,使其基于从我回答这个问题的fork功能的同步过程