2013-11-28 61 views
0

ajax請求後,我發送Image Magick(子進程)選項並創建文件。 如果我立即發送迴應客戶 - 我有錯誤 - img不存在。我的解決方案,設置超時和發送響應(硬編碼)。 我可以設置超時和檢查文件與FS模塊,但它是正確的方式? 或者我可以在文件存在後發出新事件,但可以爲我輸入樣本嗎? 或者這個任務有另一個解決方案?創建後檢查文件。 FS +超時?

fs.stat(currentImage, function(err, background) { 

     if (background && background.isFile) { 

      async.series([ 
       function(callback) { 
        var magickOpts = memOptions; 
        var im = spawn('convert', magickOpts); 
        callback(null, 'done'); 
       } 
      ], 
      function(err, result) { 
       setTimeout(function() { 
        res.send({ 
         status: '200', 
         src: '/images/mems/'+tempName+'.jpg', 
         tempName: tempName 
        }); 
       }, 500); 
      }); 

     } else { 
      res.send({ 
       status: '404', 
       text: 'background image not found' 
      }); 
     } 

    }); 
+0

你能發表相關的代碼嗎? – robertklep

+0

嗨,@robertklep。附代碼。 –

回答

1

你應該等待子進程退出(通過偵聽close事件),您發送到客戶端響應之前。

此外,async.series似乎並沒有在這種情況下真正使用,所以我離開了出來:

fs.stat(currentImage, function (err, background) { 

    if (background && background.isFile) { 
    var magickOpts = memOptions; 
    var im = spawn('convert', magickOpts); 
    im.on('close', function() { 
     res.send({ 
     status: '200', 
     src: '/images/mems/' + tempName + '.jpg', 
     tempName: tempName 
     }); 
    }); 
    } else { 
    res.send({ 
     status: '404', 
     text: 'background image not found' 
    }); 
    } 

}); 

順便說一句,也就是在im包,它包裹的ImageMagick在節點使用。

+0

哇!謝謝!我可以聽所有其他子進程的'close') –

+0

@MaxP不確定你的意思,但如果你想知道'spawn'創建的子進程是否已經退出,'close'事件是一個可以聽的 – robertklep

+0

是的,它是。非常感謝,@robertklep –