【问题标题】:How to handle asynchronous callbacks within an if - else statement?如何在 if - else 语句中处理异步回调?
【发布时间】:2015-07-03 23:14:55
【问题描述】:

对于一个项目,我需要在五个 if 语句中更改文件中的一些值,这些语句一个接一个地执行,并且在完成所有这些操作之后,我需要保存文件。其中一项更改包含异步保存图像功能。我遇到的问题是,当程序开始写入文件时,该功能尚未完成。我应该如何处理 if 语句中的回调?保存图像功能应该在程序进入下一个 if 语句之前执行。

if(criterium1){... //Alter file}

if(criterium2){
    saveImage(searchValue, folder,callback(error)){
        ... //Alter file
    }
if(criterium3){... //Alter file}

fs.writeFile(opfFile, xml, function(error) {
    callback(null);
 });

 var saveImage = function(searchValue, folder, callback){
    var images = require ('google-images2');
    images.search(searchValue, function(error, image){
        callback(null);
    });
 };

谁能告诉我如何处理这个问题? 谢谢! 亲切的问候, 伊娃

【问题讨论】:

    标签: node.js if-statement asynchronous synchronization


    【解决方案1】:

    正如 Transcendence 所说,异步非常适合这种流程。

    我刚刚写了一个简单的async-if-else 模块,因为我在我的链步骤中遇到了类似的问题。

    async.waterfall([
       async.if(criterium1, fnCriterium1),
       async.if(criterium2, fnCriterium2),
       async.if(criterium3, fnCriterium3).else(fnCriteriumAlternative)
     ], handler);
    

    希望对你有帮助!

    干杯

    【讨论】:

      【解决方案2】:

      您可以使用异步库,特别是它的series 控制流。 https://caolan.github.io/async/docs.html#series

      您希望将 if 语句作为数组中的任务执行(第一个参数)。确保在异步操作完成后调用回调。第二个参数是一个回调,当你的所有任务都完成时会执行。

      async.series([
          function(callback){
              if(criterium1) {
                //Alter file
                // make sure to call the callback
              } else {
                callback(null, null);
              }
          },
          function(callback){
              if(criterium2) {
                //Alter file
                // make sure to call the callback
                // looks like you can just pass callback into the saveImage function
              } else {
                callback(null, null);
              }
          }
      ], function () {
        fs.writeFile(opfFile, xml, function(error) {
          callback(null);
       });
      });
      

      【讨论】:

      • 但是有可能第二条语句不会执行,那么第三条语句和writeFile就不会执行了吧?
      • 由于多余的大括号,我无法理解您的示例代码。
      • 对不起。这样更好吗?
      • 让我改变我的答案
      • 抱歉耽搁了一段时间
      【解决方案3】:

      尝试将所有函数包装在一个承诺中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-15
        • 2023-01-08
        • 2017-01-14
        • 2021-08-31
        • 1970-01-01
        • 2022-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多