2016-01-25 83 views
1

我定義了可以在終端運行的簡單吞吐任務,其中gulp load。目的是獲取沒有location屬性集的用戶數量。 但是,數字成功返回後,該進程掛起終端,我需要ctrl-c停止它。請注意,這不是異步調用,並使用mongoose插件來訪問數據庫。吞吐任務在Nodejs完成任務後掛起

gulp.task('load', function() { 
    dbCall.getUserNumberWithoutLocation(); 
}); 

var getUserNumberWithoutLocation = function() { 
    var query = User.find({ 'location': null }); 
    query.exec(function(err, users) { 
     for (var i = 0; i < users.length; i++) { 
      console.log(users[i].location); 
     } 
     console.log(users.length); 
    }) 
}; 
+1

「這不是一個異步調用」 - 如果你在談論User.find(),當然是一個異步調用。 – Tomalak

+0

@Tomalak啊,你是對的,我的骨頭!儘管如此,吞吐並沒有正確終止異步調用?這是設計嗎? –

+0

當然它確實如果你告訴它通話已完成。 (畢竟,吞嚥本身是非常異步的)。查看'gulp.task'的回調語義。 https://github.com/gulpjs/gulp/blob/master/docs/API.md#async-task-support(提示 - 你可以在這裏寫一個答案你自己的問題,這是一個很好的機會。 ) – Tomalak

回答

1

儘管提示仍然不gulp.task完成後返回(這可能是我的本地機器的問題),我把我的代碼在這裏。 callback函數被傳遞到內部函數getUserNumberWithoutLocation中,其中它被調用一次User.find完成。

gulp.task('load', ['style'], function (callback) { 
    dbCall.getUserNumberWithoutLocation(callback); 
}); 
exports.getUserNumberWithoutLocation = function(callback) { 
    var query = User.find({'location': null}); 
    query.exec(function(err, users) { 
     console.log(users.length); 
     if (err) { 
      return callback(err); 
     } 
     callback(); 
    }); 
}; 
+0

這實際上應該工作。 – Tomalak

+0

我有類似的問題。我有一個吞嚥任務,運行其他任務,然後完成。 – Maninacan