nodejs 如何同步执行代码并获取返回值

发布于 2022-09-06 20:53:53 字数 834 浏览 72 评论 0

我有异步代码段,这段代码其实是 new Promise() 的对象,但是我需要多次循环这个对象同时获取其中的值,代码如下:

module.exports = function (options) {
    var nodegit = require("nodegit");
    var configs = [
        {
            "path": "path1",
            "branch": ""
        },
        {
            "path": "path2",
            "branch": ""
        }
    ];
    for (var i = 0; i < configs.length; i++) {
        nodegit.Repository.open(configs[i].path).then(function (repo) {
            return repo.getCurrentBranch();
        }).then(function (reference) {
            configs[i].branch = reference.name();
            return reference;
        });
    }
    console.log(configs);
};

上面的代码的意思是根据configs.path来更新configs.branch;但是 nodegit 使用的是 Promise 同步执行模式,请问我如何能获取 Promise.then 的数据,或者上面的代码如何修改比较合适?谢谢!

难道我需要通过循环一层一层的 then 下去?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

地狱即天堂 2022-09-13 20:53:53

你的代码没什么大问题,主要是第二个configs[i]用错了,再了解一下Promise.all就知道怎么写了;
参考代码:

module.exports = function (options) {
    var nodegit = require("nodegit");
    var configs = [
        {
            "path": "path1",
            "branch": ""
        },
        {
            "path": "path2",
            "branch": ""
        }
    ];
    
    var getBranch = function(path){
        return nodegit.Repository.open(path).then(function (repo) {
            return repo.getCurrentBranch();
        })
    }
    
    var promises = configs.map(v=>{
        return getBranch(v.path).then(reference=>{
            v.branch = reference.name();
            return v;
        })
    })

    return Promise.all(promises)
};

@unicreators 的效率会差一点
@RandyO 的代码和我的代码意思差不多,只是那个All应该是小写

async/await是好东西,但建议先完全搞清楚Promise再使用.

丑丑阿 2022-09-13 20:53:53

使用 es6 async/await

var nodegit = require("nodegit");
module.exports = async function (paths) {        
    let result = [];
    for (var i = 0; i < paths.length; i++) {
        let repo = await nodegit.Repository.open(paths[i]);
        let reference = await repo.getCurrentBranch();        
        result.push({ path: paths[i], reference, branch: reference.name() });
    }    
    return result;    
};

使用await调用

let result = await require('...')(['path1','path2', 'pathN']);
// or 
require('...')(['path1','path2', 'pathN']).then(result){
    // ...
}
随波逐流 2022-09-13 20:53:53
var nodegit = require("nodegit");
module.exports = async function(options) {
    var configs = [{
        "path": "path1",
        "branch": ""
    }, {
        "path": "path2",
        "branch": ""
    }];
    var promises = []
    for (let i = 0; i < configs.length; i++) {
        promises.push(nodegit.Repository.open(configs[i].path));
    }

    const repos = await Promise.All(promises);

    for (let i = 0; i < configs.length; i++) {
        let reference  = await repos[i].getCurrentBranch();
        configs[i].branch = reference.name();
    }

    console.log(configs);
}
忆依然 2022-09-13 20:53:53

谢谢大神们的回复。这个问题基本上是按照我原来的写法思路实现的,具体见 unicreators 下的评论。解决方案上是使用 Promise.all 实现。同时原则上如果不需要 return ,不要使用 async/await。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文