【问题标题】:How do we the halt the execution flow, till we get the response from a callback function?我们如何停止执行流程,直到我们得到回调函数的响应?
【发布时间】:2017-09-16 01:36:44
【问题描述】:

我将一个数组传递给async.each(),其中执行将通过if 条件,当进入else 语句时满足条件时,它将项目添加到数组中,执行将不等待shippo响应。它移动到下一行并将响应发送到服务器。

我注意到几秒钟后我们收到了来自shippo 的响应,所以我在else 块完成后放置了一个setTimeout() 函数,但即使在我的控制台中,消息'c' 也会最后打印.我对回调非常困惑,它们将如何工作。在我们收到shippo 的响应之前,有没有其他方法可以停止执行流程。

var async = require('async');
import each from 'async/each';

async.each(trackingnumbers, function (value, callback) {
            value['TrackingNo'] = parseInt(value['TrackingNo']);
            value['Provider'] = value['Provider'].toLowerCase();

    if (value['Provider'] == "domestic") {
                items.push({ 'TrackingNo': value['TrackingNo'], 'Provider': value['Provider'], 'Status': 'Completed' });
                console.log('a');
             }
            else {
              console.log('b');
                shippo.track.get_status(value['Provider'], value['TrackingNo']).then(function (status) {
                  console.log('c');
                    items.push({ 'TrackingNo': value['TrackingNo'], 'Provider': value['Provider'], 'Status': status.tracking_status });
                }, functionconsole.log('d'); (err) {
                    console.log("There was an error retrieving tracking information: %s",+ err);
                    callback('There was an error retrieving tracking information:');
                    // 
                });
              console.log('d');  
   e  }
   console.log('e');
            setTimeout(function(){
                callback();
            },3000);
}, function (err) {
      if (err) {
          console.log('error occured ' + '|' + err);
      }
      else {
          console.log(items);
          res.setHeader("Access-Control-Allow-Origin", "*");
          res.send(items).status('200');
      }
 });

Here is my output along with the shippo response after we placed an timeout function

【问题讨论】:

  • 回调的想法是在调用之后你什么都不做,然后在调用完成时执行回调函数。要停止执行,您在调用后根本没有任何代码。

标签: javascript node.js callback shippo


【解决方案1】:

我强烈建议查看有关 AsyncFunction()async 库的文档。无论您是否已成功完成请求发生错误,您似乎都应该调用回调。

由于 Shippo 库使用 'when' 来处理类似 Promise 的链接(在撰写本文时,我有一个开放的 PR on GitHub 将其弃用为更正常的 Promise 链接)。

由于使用了'when',这意味着要捕获错误,您将传递.then() 两个函数,一个用于成功路径,另一个用于处理错误。它会像这样工作:

shippo.track.get_status('usps', '1122334455667788')
      .then(function (results){
         // do stuff with your successful function call
      }, function (error) {
         // do stuff with the error you just received
      });

console.log('c') 最后打印出来的原因是因为它不会执行该行,直到原始承诺解决了从 Shippo 检索跟踪状态。

此外,通过在 setTimeout() 函数中调用 callback(),您只会将每次迭代的解析延迟 3 秒,但不一定保证您对 shippo 函数的调用成功与否.

您应该调用传递给then() 的每个函数内部callback() 函数。因此,一旦您收到结果,就可以解析async.each() 调用的函数实例。通过处理这些函数内部的callback(),您可以正确处理成功和错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2012-11-11
    • 2013-06-01
    • 1970-01-01
    • 2021-12-20
    • 2020-01-25
    相关资源
    最近更新 更多