【问题标题】:JS | Get return from sub FunctionJS |从子函数获取返回
【发布时间】:2017-11-12 06:41:19
【问题描述】:

我需要得到一个子函数的返回。

所以我有以下代码,需要父函数中doc 的结果,另外我想返回一个数组,所以我需要复制数组,因为父数组将在子进程关闭后被删除?

感谢您的宝贵时间!

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? 
    })
}

【问题讨论】:

  • 在我看来是异步的。可以这样想,test 启动了一些进程(db.allDocs),这需要一些时间才能完成,所以与其等待它完成,不如说“这是一个完成后运行的函数”(回调,您将其称为子函数)。但是当这种情况发生时,测试早就返回了。因此,您应该对返回的结果在回调中 执行您计划执行的任何操作

标签: javascript arrays function pouchdb


【解决方案1】:

您的函数对数据库执行异步调用,因此您不能以同步方式返回结果。您必须在回调中处理返回的值:

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 或拥有 Babel transpiling with ES2017,则可以使用 async/await

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
} 

【讨论】:

    【解决方案2】:

    试试:

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

    【讨论】:

    • 这是有效的! - 这是固定版本jsfiddle.net/19rL0w41 谢谢!
    • 你为什么使用 const 而不是 function?
    • 我使用的是 ES6“胖箭头语法 ()=>”,它是函数创建的简写,但有一些不同。
    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2016-01-07
    • 2014-05-28
    • 1970-01-01
    • 2020-11-30
    • 2019-03-06
    相关资源
    最近更新 更多