2017-11-11 29 views
0

サブ関数の戻り値を取得する必要があります。JS |サブ関数から戻り値を返す関数

私は次のコードを持って、docの結果をParent関数に追加する必要があります。さらに、サブプロセスが閉じられた後に親配列が削除されるため、Arrayをコピーする必要があります。

ありがとうございました!

function test(){ 
 
    var HereINeedTheArray [] 
 
    db.allDocs({include_docs: true, descending: true}, function(err, doc) { 
 
     HereINeedTheArray = doc 
 
     return doc //can i get this return or do i need HereINeedTheArray? 
 
    }) 
 
}

+0

私に非同期に見えます。このように考えると、 'test'はいくつかのプロセス(db.allDocs)を開始します。完了するまでに時間がかかるので、終了するまで待つのではなく、「完了したら実行する関数です」(コールバックこれはサブ機能と呼ばれます)。しかし、テストはそれが起こったときから戻ってきました。だから、コールバックの中で返された結果*を行うことを計画していたことは何でもしなければなりません。* – James

答えて

0

あなたの機能は、このようにあなたが同期の方法で結果を返すことができない、データベースへの非同期呼び出しを実行します。あなたは、コールバックで返された値を処理する必要があります。

function test(){ 
    var HereINeedTheArray [] 
    db.allDocs({include_docs: true, descending: true}, function(err, doc) { 
     // logic to handle doc here 
    }) 
} 


それとも、あなたの関数をPromisifyことができます。

function test(){ 
    return new Promise(function(resolve, reject) { 
     db.allDocs({include_docs: true, descending: true}, function(err, doc) { 
      if (err) 
       reject(err); 
      resolve(doc);   
     }); 
    }); 
} 

test.then(function(doc) { 
    // handle doc here 
}) 
.catch(function(err) { 
    // handle error 
}); 


それとも、node.js> = 7.6以上である場合は、async/awaitを使用することができますhave Babel transpiling with ES2017

function _test(){ 
    return new Promise(function(resolve, reject) { 
     db.allDocs({include_docs: true, descending: true}, function(err, doc) { 
      if (err) 
       reject(err); 
      resolve(doc);   
     }); 
    }); 
} 

async function test() { 
    let doc = await _test(); 
    // handle doc here 
} 
0

試してみてください。

const test =()=>{ 
    const HereINeedTheArray = [] 
    db.allDocs({include_docs: true, descending: true}, function(err, doc) { 
    HereINeedTheArray.push(doc) 
    return HereINeedTheArray 
    }) 
} 
+0

これは働いています! - ここには固定バージョンhttps://jsfiddle.net/19rL0w41/ありがとうございます! – TryingToBeABetterProgrammer

+0

なぜ関数の代わりにconstを使用していますか? – TryingToBeABetterProgrammer

+0

私はES6の "太矢印の構文()=>"を使用しています。これは、いくつかの違いがある関数の作成の略です。 –