【问题标题】:complete callback is not being called for async.parallel没有为 async.parallel 调用完整的回调
【发布时间】:2015-12-15 07:15:25
【问题描述】:

我需要对 100 行进行 api 调用以填充描述(我更喜欢并行执行)。但是,在这种情况下,某些行可能没有描述,api 将返回 404。当有一行或多行没有描述时,我需要显示一条警告消息,并从模态数据中删除这些行,这意味着我需要一个完整的回调或完成回调。但是没有调用 completeCallback,我“认为”这是因为某些行没有描述。

您能告诉我如何实现吗?

这是我的代码:

    function getDescription(processedData) {
        $.ajax({
            url: baseApiUrl + '/Summary?id=' + processedData.id,
            type: 'GET',
            dataType: 'json',
            contentType: 'application/json',
            success: function (data) {
                processedData.SummaryDescription = data;
            },
            error: function (xhr, status, e) {
                if(xhr.statusCode === 404){
                    processedData.SummaryDescription = '';
                }else{

                }
            }
        });
    };

//Below line is in a look
parallelCallArray.push(getDescription.bind(null, processedData));

//Below line is out of loop
Async.parallel(parallelCallArray, function(err, result){
  console.log('all calls completed...');
}); 

【问题讨论】:

  • contentType: 'application/json', — 您正在发出 GET 请求并且没有发送 data。您描述的内容类型是什么?
  • 好点。我需要删除它。复制过去的问题;-)

标签: javascript node.js asynchronous


【解决方案1】:

您缺少并行执行的函数的回调参数。如果您不执行回调,async 将假定您的函数尚未完成。试试这样的:

function getDescription(processedData, cb) {
  $.ajax({
    url: baseApiUrl + '/Summary?id=' + processedData.id,
    type: 'GET',
    dataType: 'json',
    contentType: 'application/json',
    success: function (data) {
      processedData.SummaryDescription = data;
      cb();
    },
    error: function (xhr, status, e) {
      if (xhr.statusCode === 404) {
        processedData.SummaryDescription = '';
      } else {
      }
      cb(new Error(e));
    }
  });
}

【讨论】:

  • 感谢您的回复。我需要将该回调作为绑定的第一个参数传递吗? parallelCallArray.push(getDescription.bind(function(){ console.log('calback'); }, processedData));
  • 没有。 asyncfunc(cb) 这样调用你的函数,并且你已经绑定了一个参数,所以 cb 将作为第二个参数传递。因此,除了将cb 参数添加到您的函数之外,无需进行其他更改。
  • 酷。有用。现在问题出在 completeCallback 中,结果对象是 array[100] 但每个项目都是未定义的。我需要带有附加摘要描述的 processData。这样在完整的回调循环中抛出它并删除那些没有描述的。有什么线索吗?
  • 假设您希望 data 用于每个成功的并行函数,您将在 success 回调中将 cb() 更改为 cb(data)。然后您甚至可以完全删除您的 .bind(null, processedData),因为 processedData 无论如何都不是每个函数的变量。
猜你喜欢
  • 2010-09-06
  • 2016-11-20
  • 2017-05-03
  • 1970-01-01
  • 2017-12-16
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多