由于 forEach 是同步的并且请求是异步的,因此无法完全按照您的描述进行操作。但是,您可以做的是创建一个函数来处理 docs 数组中的一项并将其删除,然后当您完成处理后,转到下一个:
var results;
var productsToProcess;
MongoClient.connect( 'mongodb://localhost:27017/suppliers', function ( err, db ) {
assert.equal( null, err );
var findDocuments = function ( db ) {
var collection = db.collection( 'products' );
collection.find( {
$and: [ {
"qty": {
$gt: 0
}
}, {
"costex": {
$lte: 1000.0
}
} ]
}, {
"mpn": 1,
"vendor": 1,
"_id": 0
} ).limit( 1 ).toArray( function ( err, products ) {
assert.equal( err, null );
productsToProcess = products;
getSearching();
db.close();
} );
}
findDocuments( db );
} );
function getSearching() {
if ( productsToProcess.length === 0 ) return;
var product = productsToProcess.splice( 0, 1 )[0];
var keyword = product[ 'vendor' ] + ' "' + product[ 'mpn' ] + '"';
google( keyword, function ( err, res ) {
if ( err ) console.error( err )
for ( var i = 0; i < res.links.length; ++i ) {
var result = res.links[ i ];
var obj = {
title: res.links[ i ].title,
href: res.links[ i ].href,
description: res.links[ i ].description
}
results.push( obj );
}
}, processData );
}
function processData( results ) {
MongoClient.connect( 'mongodb://localhost:27017/google', function ( err, db ) {
assert.equal( null, err );
// insert document to DB
var insertDocuments = function ( db, callback ) {
// Get the documents collection
var collection = db.collection( 'results' );
// Insert some documents
collection.insert( results, function ( err, result ) {
assert.equal( err, null );
console.log( "Document inserted" );
callback( result );
db.close();
} );
}
insertDocuments( db, getSearching );
} );
}
编辑
将产品从数据库移至productsToProcess 变量,并将getSearching() 更改为不再需要参数。